【问题标题】:Why can't I stop my Mojo app using systemd?为什么我不能使用 systemd 停止我的 Mojo 应用程序?
【发布时间】:2018-06-22 20:17:08
【问题描述】:

我可以通过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 

如果我通过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"

我在这里错过了什么?

【问题讨论】:

  • 我通常用systemctl start/stop/status/restart $serviceName 控制我的systemd 单元。这有什么区别吗? IE。 systemctl stop ldsquiz-org?
  • @PerlDuck 对我来说似乎有同样的问题。它认为该应用程序已停止,但原始进程仍在徘徊。
  • 我知道你提到的文档说Type=simple,但这个prefork 参数让我怀疑。也许试试Type=forking。有关可能的值,请参阅here。也许您还需要尝试一下KillMode= 设置。有关可能的值,请参阅here。并且记得在你摆弄单元文件的时候打电话给systemctl daemon-reload
  • @PerlDuckwonderful! KillMode=control-group 为我做了诀窍。看起来我需要查看有关 Mojo 文档补丁的信息。如果您想写一个答案,我很乐意接受。
  • 作为附录,此问题现已在 Mojo 文档中得到解决:github.com/kraih/mojo/commit/…

标签: perl systemd mojolicious


【解决方案1】:

显然,Mojolicious Cookbook w.r.t 中有一个缺陷。 preforking 和 systemd 单元。

They say:

要使用 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

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 可以省略,因为此设置是默认设置。

参考资料:

【讨论】:

猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2021-08-14
  • 2014-03-02
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多