我有一个相当简单的web服务,使用Django和Gunicorn / Uvicorn:
foo.service
[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.targetfoo.socket
[Unit]
Description=Foo socket
[Socket]
ListenStream=/run/foo.sock
[Install]
WantedBy=sockets.target我已经启用并启动了服务。当我重新部署应用程序时,我正在迁移DB并做其他事情,在此期间,我需要应用程序离线。但当我发布:
sudo systemctl restart foo.service我收到这条消息
Warning: Stopping foo.service, but it can still be activated by:
foo.socket我应该重新启动套接字吗?禁用服务而只保留启用的套接字?(套接字依次由nginx使用)。这里的最佳做法是什么?我不希望在迁移DB时通过套接字激活服务。
发布于 2023-01-03 16:46:13
以下是三种选择:
sudo systemctl stop foo.{service,socket}[Install]部分。这是不需要的,因为服务已经Requires=了套接字。当服务启动时,套接字也会启动。PartOf=foo.service添加到套接字的[Unit]部分。这意味着当foo.service停止或重新启动时,该命令将传播到套接字。# 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和套接字始终保持同步。
Requires=。因为我们没有直接启动服务,所以它不需要这样做。[Install]部分。我们将依靠插座代替。PartOf=foo.socket添加到服务的[Unit]部分。如果您的应用程序在stdin或stdout上退出EOF,则可能不需要这样做。StandardInput=socket添加到服务的[Service]部分。这并不是绝对必要的,但如果套接字没有启动,它将使systemctl start foo.service失败。# foo.service
[Unit]
PartOf=foo.socket
After=network.target
[Service]
StandardInput=socket
...
#foo.socket
[Socket]
ListenStream=/run/foo.sock
[Install]
WantedBy=sockets.targethttps://unix.stackexchange.com/questions/730156
复制相似问题