使用Monit监视python程序

时间:2014-05-04 08:55:33

标签: monit

我正在使用Monit来监控系统。我有一个我想要监视的python文件,我知道我需要创建一个包装脚本,因为python不会生成pid文件。我按照site上的说明操作,但是我无法启动脚本。我之前从未创建过包装器脚本,所以我认为我的脚本中有错误。来自monit的日志说“无法启动”

Monit规则

check process scraper with pidfile /var/run/scraper.pid
   start = "/bin/scraper start"
   stop = "/bin/scraper stop"

包装脚本

#!/bin/bash

PIDFILE=/var/run/scraper.pid

case $1 in
   start)
      echo $$ > ${PIDFILE};
      source /home
      exec python /home/scraper.py 2>/dev/null
   ;;
   stop)
      kill `cat ${PIDFILE}` ;;
   *)
      echo "usage: scraper {start|stop}" ;;
esac
exit 0

2 个答案:

答案 0 :(得分:7)

使用exec将替换exec程序中的shell,这不是你想要的,你希望你的包装器脚本启动程序并在返回之前将其分离,编写它PID到文件,以便以后停止。

这是一个固定版本:

#!/bin/bash

PIDFILE=/var/run/scraper.pid

case $1 in
   start)
       source /home
       # Launch your program as a detached process
       python /home/scraper.py 2>/dev/null &
       # Get its PID and store it
       echo $! > ${PIDFILE} 
   ;;
   stop)
      kill `cat ${PIDFILE}`
      # Now that it's killed, don't forget to remove the PID file
      rm ${PIDFILE}
   ;;
   *)
      echo "usage: scraper {start|stop}" ;;
esac
exit 0

答案 1 :(得分:1)

你也可以通过添加一个在你的脚本中编写pidfile的小函数来完全绕过整个包装器。例如:

from itertools import permutations

sorted(set(x for x in permutations('rrbb', 4)))

[('b', 'b', 'r', 'r'),
 ('b', 'r', 'b', 'r'),
 ('b', 'r', 'r', 'b'),
 ('r', 'b', 'b', 'r'),
 ('r', 'b', 'r', 'b'),
 ('r', 'r', 'b', 'b')]

我发现自己使用这种方法,因为它是一种更直接的方法,它是自包含在脚本中的。