为什么我不能使用systemd停止我的Mojo应用程序?

oal*_*ers 10 perl mojolicious systemd

我可以通过systemd没有任何问题启动我的Mojo应用程序,但我无法以相同的方式停止或重新启动它.我主要从http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Pre-forking上的Mojo文档中挖取了我的配置:

[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 
Run Code Online (Sandbox Code Playgroud)

如果我通过sudo service ldsquiz-org stopsyslog说停止它,Jan 13 16:37:48 web-hosting systemd[1]: Stopped ldsquiz.org.但进程仍在运行.

一个restartvia 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"
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Per*_*uck 8

显然,Mojolicious Cookbook中的预制和系统单元存在缺陷.

他们说:

要使用systemd管理预分支Web服务器,您可以使用这样的单元配置文件.

[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
Run Code Online (Sandbox Code Playgroud)

KillMode=process设置被证明是错误的,需要被替换KillMode=control-group-这是默认设置,所以我们可以完全放弃它.

KillMode文档说:

如果设置为control-group,则此单元的控制组中的所有剩余进程在单元停止时被终止(对于服务:执行stop命令后,如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
Run Code Online (Sandbox Code Playgroud)

请注意,KillMode=control-group可以省略,因为此设置是默认设置.

参考文献: