我启用了 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