Systemd 在 kill 后不会重新启动 monit

Systemd 在 kill 后不会重新启动 monit

我启用了 systemd 在启动时加载 monit

sudo systemctl enable monit
sudo systemctl restart monit
ps aux | grep monit
root      6843  0.0  0.2 112492  2948 ?        Sl   18:19   0:00 /usr/bin/monit -c /etc/monit/monitrc
lookpla+  6857  0.0  0.0  14212  1008 pts/0    S+   18:21   0:00 grep --color=auto monit

但是当我杀死 monit 时它不会再次启动:

 sudo kill 6843
 ps aux | grep monit
 lookpla+  6862  0.0  0.1  14212  1028 pts/0    S+   18:23   0:00 grep --color=auto monit

Systemctl 显示 monit 处于活动状态但已退出

sudo systemctl status monit.service
● monit.service - LSB:服务和资源监控守护进程
   已加载:已加载(/etc/init.d/monit;已生成;供应商预设:已启用)
  插入:/etc/systemd/system/monit.service.d
           └─覆盖.conf
   活跃:自 2017-09-06 星期三 18:19:17 UTC 以来活跃(已退出);4 分钟 29 秒前
     文档:man:systemd-sysv-generator(8)
  进程:6830 ExecStop=/etc/init.d/monit stop(代码=exited,状态=0/SUCCESS)
  进程:6835 ExecStart=/etc/init.d/monit start(代码=exited,状态=0/SUCCESS)
 主 PID:6843(代码=已退出,状态=0/成功)

9 月 6 日 18:19:17 localhost systemd[1]: 已停止 LSB:服务和资源监控守护进程。
9 月 6 日 18:19:17 localhost systemd[1]: 正在启动 LSB:服务和资源监控守护进程...
9月6日 18:19:17 localhost monit[6835]: * 启动守护进程监视器 monit
9 月 6 日 18:19:17 localhost monit[6835]:...完成。
9 月 6 日 18:19:17 localhost systemd[1]: monit.service: 启动后 PID 文件 /run/monit.pid 无法读取(暂时无法读取):没有此文件或目录
9 月 6 日 18:19:17 localhost systemd[1]:已启动 LSB:服务和资源监控守护进程。

您能帮我设置 systemd 以便它在被终止后重新启动 monit 吗?

我使用 ubuntu 17.04

答案1

我相信在您的服务文件中添加该Restart选项systemd将确保它在未被命令停止时启动systemctl stop

Restart=[no | on-success | on-failure | on-abnormal | on-watchdog | on-abort | always ]

信息:

不:默认情况下,服务不会重新启动

成功时:仅当服务进程干净退出时才会重新启动

故障时:当进程以非零退出代码退出时将重新启动

中止时:仅当服务进程因未捕获信号(未指定为干净退出状态)而退出时才会重新启动

看门狗:仅当服务的看门狗超时到期时才会重新启动

总是:无论是否正常退出、是否被信号异常终止或是否超时,都将重新启动

Restart= 配置当服务进程退出、被终止或达到超时时是否重新启动服务。服务进程可能是主服务进程,但也可能是使用 ExecStartPre=、ExecStartPost=、ExecStop=、ExecStopPost= 或 ExecReload= 指定的进程之一。当进程的终止是 systemd 操作(例如服务停止或重新启动)的结果时,服务将不会重新启动。超时包括错过看门狗“keep-alive ping”截止时间以及服务启动、重新加载和停止操作超时。

可采用 no、on-success、on-failure、on-abnormal、on-watchdog、on-abort 或 always 之一。如果设置为 no(默认),则不会重新启动服务。如果设置为 on-success,则仅当服务进程干净退出时才会重新启动。在这种情况下,干净退出意味着退出代码为 0,或信号 SIGHUP、SIGINT、SIGTERM 或 SIGPIPE 之一,以及 SuccessExitStatus= 中指定的退出状态和信号。如果设置为 on-failure,则当进程以非零退出代码退出、由信号终止(包括核心转储,但不包括前面提到的四个信号)、操作(如服务重新加载)超时以及触发配置的看门狗超时时,服务将重新启动。如果设置为 on-abnormal,则当进程因信号(包括核心转储,不包括上述四个信号)终止、操作超时或触发看门狗超时时,将重新启动服务。如果设置为 on-abort,则仅当服务进程因未捕获信号(未指定为干净退出状态)而退出时,才会重新启动服务。如果设置为 on-watchdog,则仅当服务的看门狗超时到期时,才会重新启动服务。如果设置为 always,则无论服务是否干净退出、是否因信号异常终止或超时,都将重新启动服务。

在此处输入图片描述

图片来源

来源:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

答案2

RemainAfterExit配置选项起了作用

经过几个小时对 systemd 配置进行实验后,我找到了有效的解决方案:

sudo systemctl edit monit

然后填写如下配置:

[Service]
PIDFile=/var/run/monit.pid
Restart=always
RemainAfterExit=no

并重新加载守护进程:

sudo systemctl daemon-reload
sudo systemctl restart monit

现在,当我终止它时,systemd 会重新启动我的 monit 服务:

ps aux | grep monit
root      7822  0.0  0.2 112476  2872 ?        Sl   19:09   0:00 /usr/bin/monit -c /etc/monit/monitrc
lookpla+  7855  0.0  0.0  14212  1008 pts/0    S+   19:12   0:00 grep --color=auto monit

sudo kill 7822
root      7872  0.0  0.2 112476  2964 ?        Sl   19:13   0:00 /usr/bin/monit -c /etc/monit/monitrc
lookpla+  7875  0.0  0.0  14212   984 pts/0    S+   19:13   0:00 grep --color=auto monit

相关内容