monit坚持要对一个运行良好的程序进行计时

chr*_*_st 2 monit

我在使用monit监控程序时遇到问题.

我在覆盆子pi上运行它,从源代码构建了monit 5.11; 我尝试使用存储库中的版本,但它是5.4并且不支持我想要的一些语法.

我试图遵循"问:我有一个程序不会创建自己的pid文件.由于monit要求所有程序都有一个pid文件,我该怎么办?" 在FAQ中输入.

这是我的start_sensors.sh脚本(它只运行我的python程序,而不是wiki示例中的java程序):

#!/bin/bash

case $1 in
  start)
     echo $$ > /var/run/start_sensors.pid;
     exec 2>&1 /usr/bin/python /home/pi/temperature/post_temps.py 1>/tmp/post_temps.out
     ;;
   stop)
     kill `cat /var/run/start_sensors.pid` ;;
   *)
     echo "usage: start_sensors {start|stop}" ;;
esac
exit 0
Run Code Online (Sandbox Code Playgroud)

这是我的/etc/monit/monitrc条目:

# Run temperature sensor monitor
check process start_sensors.sh with pidfile /var/run/start_sensors.pid
   start = "/home/pi/temperature/start_sensors.sh start"
   stop = "/home/pi/temperature/start_sensors.sh stop"
Run Code Online (Sandbox Code Playgroud)

监视日志中的输出如下所示:

[EST Jan 24 14:21:16] info     : 'raspberrypi' Monit reloaded
[EST Jan 24 14:21:16] error    : 'start_sensors.sh' process is not running
[EST Jan 24 14:21:16] info     : 'start_sensors.sh' trying to restart
[EST Jan 24 14:21:16] info     : 'start_sensors.sh' start: /home/pi/temperature/start_sensors.    sh
[EST Jan 24 14:21:46] error    : 'start_sensors.sh' failed to start (exit status -1) --     Program /home/pi/temperature/start_sensors.sh timed out
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,monit启动程序,运行正常,然后monit因为"超时"而在30秒后杀死它.

我的程序运行正常,并生成正在发送到/tmp/post_temps.out文件的正确输出.

我不明白为什么monit会对程序进行计时...这应该是一个长期运行的过程!

我已经尝试更改start_sensors.sh脚本,以便将程序放在后台(并编写自己的/var/run/start_sensors.pid文件),然后monit每隔30秒左右启动一个新实例,不要停止旧的,并写入pid文件.就像它甚至没有看到pid文件.

谢谢!

chr*_*_st 7

以下作品:

#!/bin/bash

case $1 in
  start)
     /usr/bin/python /home/pi/temperature/post_temps.py 1>/tmp/post_temps.out &
     echo $! > /var/run/start_sensors.pid ;
     ;;
   stop)
     kill `cat /var/run/start_sensors.pid` ;;
   *)
     echo "usage: start_sensors {start|stop}" ;;
esac
exit 0
Run Code Online (Sandbox Code Playgroud)

  • 对于想知道为什么会这样的其他人:我相信这是有效的,因为 python 脚本从未退出(它不是守护进程),所以你在 start 命令末尾使用了 `&` 来启动一个新的后台进程并保存新进程的 PID 而不是脚本的 PID(有关 bash 命令的列表,请参阅 http://stackoverflow.com/a/5163260/2544629) (2认同)