Итак, я написал этот простой сценарий службы 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 минут бездействия.
Если я запустил этот процесс вручную в консоли bash, выполнив от имени веб-пользователя: -
source ~/.bash_profile
workon myproject
uwsgi --ini /var/www/prod/myproject/releases/current/myproject/uwsgi_prod.ini
мой процесс не умирает после простоя.
В чем может быть проблема?
Решил после разговора с другим разработчиком на systemd
канал.
Добавляя это в [Service]
раздел решил проблему: -
Type=forking
PIDFile=/tmp/project.pid-3030
Причина проста. Если Type
не объявлен, по умолчанию Type=simple
, который ожидает, что процесс НЕ разветвляется, поэтому, когда bash
выходы, systemd
думает, что процесс мертв, и срывает cgroup.
Как вы отметили, вам необходимо указать Type
в противном случае systemd
по умолчанию Type=simple
.
Однако официальные документы uWSGI по управлению uWSGI с systemd
использовать Type=notify
скорее, чем Type=forking
потому что тогда нет необходимости указывать PIDFile
.