【问题标题】:monit insists on timing out a program that's running finemonit 坚持让运行良好的程序超时
【发布时间】:2015-01-24 19:37:47
【问题描述】:

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

我在树莓派上运行它,从源代码构建了 monit 5.11;我尝试使用存储库中的版本,但它是 5.4 并且不支持我想要的以下某些语法。

我正在尝试遵循“问:我有一个程序没有创建自己的 pid 文件。由于 monit 要求所有程序都有一个 pid 文件,我该怎么办?” entry in the 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

这是我的/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"

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

[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

如您所见,monit 启动程序,它运行良好,然后 monit 在 30 秒后由于“超时”而将其杀死。

我的程序运行良好,并产生了正确的输出 我要发送到 /tmp/post_temps.out 文件。

我不明白为什么 monit 将程序超时...它应该是一个长期运行的过程!

我尝试更改 start_sensors.sh 脚本,以便将程序置于后台(并让它编写自己的 /var/run/start_sensors.pid 文件),但随后 monit 每 30 次启动一个新实例几秒钟左右,不停止旧的,并覆盖 pid 文件。好像连 pid 文件都没有看。

谢谢!

【问题讨论】:

  • 您解决了这个问题吗?

标签: monit


【解决方案1】:

以下作品:

#!/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

【讨论】:

  • 对于其他想知道为什么会这样工作的人:我相信这是因为 python 脚本从未退出(它不是守护进程),所以你在 start 命令的末尾使用了&启动一个新的后台进程并保存新进程的 PID 而不是脚本的 PID(请参阅stackoverflow.com/a/5163260/2544629 以获取 bash 命令列表)
  • 你刚刚救了我的命 :)
猜你喜欢
  • 2013-07-27
  • 2016-05-25
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2018-05-13
相关资源
最近更新 更多