所以我编写了这个简单的 systemd 服务脚本:-
[Unit]
Description=uwsgi server script
[Service]
User=web
Group=web
WorkingDirectory=/var/www/prod/myproject/releases/current
ExecStart=/bin/bash -c 'source ~/.bash_profile; workon myproject; uwsgi --ini /var/www/prod/myproject/releases/current/myproject/uwsgi_prod.ini'
[Install]
WantedBy=multi-user.target
它运行良好 – 它启动了并且我可以在中看到我的 uwsgi 进程htop
。
然而,它在闲置5分钟后就会莫名其妙地关机。
如果我以 Web 用户身份在 Bash 控制台中执行以下命令手动启动此过程:-
source ~/.bash_profile
workon myproject
uwsgi --ini /var/www/prod/myproject/releases/current/myproject/uwsgi_prod.ini
我的进程闲置后不会死亡。
可能是什么问题?
答案1
systemd
与频道上另一位开发人员聊天后解决了这个问题。
将此添加到[Service]
部分中解决了问题:-
Type=forking
PIDFile=/tmp/project.pid-3030
原因很简单。如果Type
没有声明,则默认值为Type=simple
,这意味着进程不会分叉,因此bash
退出时systemd
会认为进程已死并拆除 cgroup。
答案2
正如您指出的,您需要指定,Type
否则systemd
默认为Type=simple
。
但是,那官方 uWSGI 文档,了解如何使用systemd
使用Type=notify
而不是Type=forking
因为那么就没有必要指定PIDFile
。