Почему я не могу остановить приложение Mojo с помощью systemd?
Я могу запустить мое приложение Mojo через systemd
без каких-либо проблем, но я не могу остановить или перезапустить его в ту же сторону. Я браконьерствовал свою конфигурацию в основном из документов Mojo в http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Pre-forking:
[Unit]
Description=ldsquiz.org
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=30
ExecStart=/home/sites/www.ldsquiz.org/checkout/bin/carton-exec app.pl prefork -m production -l http://*:5103
KillMode=process
User=ldsquiz
Group=ldsquiz
SyslogIdentifier=ldsquiz-org
[Install]
WantedBy=multi-user.target
если я остановлю его через sudo service ldsquiz-org stop
тогда syslog говорит Jan 13 16:37:48 web-hosting systemd[1]: Stopped ldsquiz.org.
но процессы все еще работает.
A restart
via systemd
похоже, я ожидал бы, так как сокет listen все еще используется из-за неудачное завершение работы:
Jan 13 16:39:13 web-hosting systemd[1]: Stopped ldsquiz.org.
Jan 13 16:39:13 web-hosting systemd[1]: Started ldsquiz.org.
Jan 13 16:39:14 web-hosting ldsquiz-org[20353]: Can't create listen socket: Address already in use at
/home/sites/www.ldsquiz.org/checkout/local/lib/perl5/Mojo/IOLoop.pm line 126.
Jan 13 16:39:14 web-hosting systemd[1]: ldsquiz-org.service: Main process exited, code=exited, status=98/n/a
Jan 13 16:39:14 web-hosting systemd[1]: ldsquiz-org.service: Unit entered failed state.
Jan 13 16:39:14 web-hosting systemd[1]: ldsquiz-org.service: Failed with result 'exit-code'.
Jan 13 16:39:15 web-hosting ldsquiz-org[16886]: [Sat Jan 13 16:39:15 2018] [info] Creating process id file "/tmp/prefork.pid"
что я пропустила?
1 ответов
по-видимому, есть недостаток в Mojolicious Поваренная Книга w.r.т. блоки preforking и systemd.
и для управления предварительным разветвлением веб-сервера с помощью systemd вы можете использовать файл конфигурации блока, как это.
[Unit] Description=My Mojolicious application After=network.target [Service] Type=simple ExecStart=/home/sri/myapp/script/my_app prefork -m production -l http://*:8080 KillMode=process [Install] WantedBy=multi-user.target
на KillMode=process
настройка оказывается неправильной и должна быть заменена на KillMode=control-group
- который является настройкой по умолчанию, поэтому мы можем удалить его в целом.
на KillMode docs говорят:
, если значение
control-group
, все остальные процессы в группе контроля этой единицы будут убиты на стопе блока (для обслуживаний: после стопа команда выполняется в соответствии с настройкой ExecStop=). если установленоprocess
, только основной процесс сам убит.
(курсив мой)
таким образом:
[Unit]
Description=My Mojolicious application
After=network.target
[Service]
Type=simple
ExecStart=/home/sri/myapp/script/my_app prefork -m production -l http://*:8080
KillMode=control-group
[Install]
WantedBy=multi-user.target
отметим, что KillMode=control-group
можно опустить, так как этот параметр является значением по умолчанию.
ссылки: