首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Systemd:如何正确重新启动服务/套接字

Systemd:如何正确重新启动服务/套接字
EN

Unix & Linux用户
提问于 2022-12-31 14:59:55
回答 1查看 396关注 0票数 0

我有一个相当简单的web服务,使用Django和Gunicorn / Uvicorn:

foo.service

代码语言:javascript
复制
[Unit]
Description=Foo service
Requires=foo.socket
After=network.target

[Service]
User=foo
Group=www-data
Restart=on-failure
WorkingDirectory=/var/lib/foo/current/backend
ExecStart=/var/lib/foo/.local/bin/poetry run gunicorn \
--env DJANGO_SETTINGS_MODULE=foo.settings \
--capture-output \
--log-level info \
--bind unix:/run/foo.sock \
--worker-class uvicorn.workers.UvicornWorker \
--workers 4 \
foo.asgi:application

[Install]
WantedBy=multi-user.target

foo.socket

代码语言:javascript
复制
[Unit]
Description=Foo socket
[Socket]
ListenStream=/run/foo.sock
[Install]
WantedBy=sockets.target

我已经启用并启动了服务。当我重新部署应用程序时,我正在迁移DB并做其他事情,在此期间,我需要应用程序离线。但当我发布:

代码语言:javascript
复制
sudo systemctl restart foo.service

我收到这条消息

代码语言:javascript
复制
Warning: Stopping foo.service, but it can still be activated by:
  foo.socket

我应该重新启动套接字吗?禁用服务而只保留启用的套接字?(套接字依次由nginx使用)。这里的最佳做法是什么?我不希望在迁移DB时通过套接字激活服务。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-01-03 16:46:13

以下是三种选择:

  1. 开始/停止这两个单位在一起。这不是最好的解决方案,因为它要求您记住这样做。
代码语言:javascript
复制
sudo systemctl stop foo.{service,socket}
  1. 只管理服务。这要求您:
    • 删除套接字的[Install]部分。这是不需要的,因为服务已经Requires=了套接字。当服务启动时,套接字也会启动。
    • PartOf=foo.service添加到套接字的[Unit]部分。这意味着当foo.service停止或重新启动时,该命令将传播到套接字。

代码语言:javascript
复制
# foo.service
[Unit]
Requires=foo.socket
After=network.target

[Service]
...

[Install]
WantedBy=multi-user.target

#foo.socket
[Unit]
PartOf=foo.service
[Socket]
ListenStream=/run/foo.sock

现在您可以sudo systemctl {restart,stop,start} foo.service和套接字始终保持同步。

  1. 只管理插座。我更喜欢这个选项,因为服务只在数据到达套接字时才开始运行。要做到这一点:
    • 从服务中删除Requires=。因为我们没有直接启动服务,所以它不需要这样做。
    • 从服务中删除[Install]部分。我们将依靠插座代替。
    • PartOf=foo.socket添加到服务的[Unit]部分。如果您的应用程序在stdin或stdout上退出EOF,则可能不需要这样做。
    • StandardInput=socket添加到服务的[Service]部分。这并不是绝对必要的,但如果套接字没有启动,它将使systemctl start foo.service失败。

代码语言:javascript
复制
# foo.service
[Unit]
PartOf=foo.socket
After=network.target

[Service]
StandardInput=socket
...


#foo.socket
[Socket]
ListenStream=/run/foo.sock
[Install]
WantedBy=sockets.target
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/730156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档