Monit不重新启动服务

我有一个node.js脚本,我想在一个Funtoo系统上进行守护进程(我标记为Gentoo,因为我不认为在这里比Gentoo有什么特别的Funtoo),我用下面的init脚本来做这个:

#!/sbin/runscript depend(){ need redis } start(){ ebegin "Starting myapp" NODE_ENV="prod" start-stop-daemon --start --background --make-pidfile -1 /var/log/myapp.log -2 /var/log/myapp.error --chdir /opt/myapp --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js eend $? } stop(){ ebegin "Stopping myapp" start-stop-daemon --stop --pidfile /var/run/myapp.pid --exec /usr/bin/node -- /opt/myapp/myapp.js eend $? } 

有了这个,我可以使用init脚本或rc-service来启动和停止服务。 然后,为了确保它在出现错误时保持运行状态,我使用下列configuration的monit

 check process myapp with pidfile "/var/run/myapp.pid" start program = "/sbin/rc-service myapp start" stop program = "/sbin/rc-service myapp stop" if failed port 8123 protocol HTTP request /myapp.client.js with timeout 10 seconds then restart 

我可以看到monit成功地监视了应用程序,并检测到它何时停止,因为当它崩溃时,我得到这个填满我的日志:

 Apr 24 21:05:35 [monit] 'myapp' trying to restart_ Apr 24 21:05:35 [monit] 'myapp' start: /sbin/rc-service_ Apr 24 21:06:05 [monit] 'myapp' failed to start_ 

在详细模式下从控制台运行监控不会给予任何更多的帮助:

 'myapp' Error testing process id [30106] -- No such process 'myapp' process is not running 'myapp' trying to restart 'myapp' Error testing process id [30106] -- No such process 'myapp' Error testing process id [30106] -- No such process 'myapp' start: /sbin/rc-service 'myapp' Error testing process id [30106] -- No such process 'myapp' Error testing process id [30106] -- No such process * WARNING: myapp has already been started 

看来正在发生的是它从来没有运行停止命令,所以pid文件仍然存在,所以start-stop-daemon不会启动它。 但是,我不完全确定如何改变这种行为,或者如果我有它configuration错误(我已经使用Gentoo / Funtoo多年,但这是我第一次编写一个初始化脚本,这是我第一次使用monit的)。

所以,总之,我错过了什么让monit成功地重启我的服务?

更新:

@ aseq的回答让我思考了一下,我不知道为什么我没有想到这一点。 只需将configuration文件中的start program行更改为:

 start program = "/sbin/rc-service myapp restart" 

使其按预期行事。 日志仍然有点脾气暴躁,因为start-stop-daemon抱怨试图停止时no matching processes found ,但是它仍然恢复。

你在正确的道路上,monit无法启动它,因为PID文件仍然存在。

我以前遇到过这些问题,我使用的解决scheme是为特定的服务创build一个初始化脚本,使用像/etc/init.d/skeleton(在debian上)作为模板(或rc.local),使确保正在创build和删除PID文件(使用start-stop-daemon等)。

因为monit不处理删除或创buildPID文件,所以我不认为还有另一个解决scheme。 无论您使用哪种脚本来启动和停止服务,都需要正确创build和删除PID文件。