所以我写了这个简单的 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
效果很好——它启动了,我可以在htop
.
然而,它在闲置 5 分钟后就莫名其妙地关机了。
如果我通过执行在 bash 控制台中手动启动此过程,作为 web 用户:-
source ~/.bash_profile
workon myproject
uwsgi --ini /var/www/prod/myproject/releases/current/myproject/uwsgi_prod.ini
我的进程在空闲后不会死。
可能是什么问题?
systemd
在与频道上的另一个开发人员聊天后解决了这个问题。将此添加到该
[Service]
部分解决了问题:-原因很简单。如果
Type
未声明,则默认为Type=simple
,它期望进程不会分叉,因此当bash
退出时,systemd
认为进程已死并拆除 cgroup。如您所述,您需要将
Type
其他systemd
默认值指定为Type=simple
.然而,官方 uWSGI 文档是关于
systemd
使用Type=notify
而不是管理 uWSGI,Type=forking
因为这样就不需要指定PIDFile
.