Почему я не могу остановить приложение 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, тогда системный журнал скажет Jan 13 16:37:48 web-hosting systemd[1]: Stopped ldsquiz.org., но процессы все еще работают.

restart через systemd выглядит так, как я и ожидал, поскольку сокет прослушивания все еще используется из-за неудачного завершения работы:

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"

Что мне здесь не хватает?


person oalders    schedule 13.01.2018    source источник
comment
Обычно я управляю своими systemd юнитами с помощью systemctl start/stop/status/restart $serviceName. Это имеет значение? т.е. systemctl stop ldsquiz-org?   -  person PerlDuck    schedule 13.01.2018
comment
@PerlDuck, похоже, у меня такая же проблема. Он думает, что приложение было остановлено, но исходные процессы все еще висят.   -  person oalders    schedule 13.01.2018
comment
Я знаю, что документы, на которые вы ссылаетесь, говорят Type=simple, но этот параметр prefork заставляет меня сомневаться. Возможно, попробуйте Type=forking. Возможные значения см. здесь. Возможно, вам также нужно немного поиграть с настройкой KillMode=. Возможные значения см. здесь. И не забывайте вызывать systemctl daemon-reload всякий раз, когда вы возитесь с файлом модуля.   -  person PerlDuck    schedule 13.01.2018
comment
@PerlDuckзамечательно! KillMode=control-group помог мне. Похоже, мне нужно узнать о патче для документации Mojo. Если вы хотите написать ответ, я с радостью его приму.   -  person oalders    schedule 13.01.2018
comment
В качестве дополнения, эта проблема теперь решена в документации Mojo: github.com/kraih/mojo. /коммит/   -  person oalders    schedule 05.02.2018


Ответы (1)


Очевидно, в Поваренной книге Mojolicious есть изъян w.r.t. 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 говорится:

Если установлено значение 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 можно не указывать, так как этот параметр используется по умолчанию.

Использованная литература:

person PerlDuck    schedule 13.01.2018
comment
Да. Этот параметр KillMode с тех пор был удален из примеров документов: github.com/mojolicious/mojo/pull/ 1183 - person Kevin G.; 16.07.2020