我正在使用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
答案 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')]
我发现自己使用这种方法,因为它是一种更直接的方法,它是自包含在脚本中的。