我有一个使用GPIO端口监视各种事物的守护进程.我已经使用python使用RPi.GPIO模块为此编写代码.
我想确保守护进程始终在运行,即在崩溃后重新启动它,并在系统启动时启动它(至关重要的是在任何用户登录之前 – 此Pi运行无头).有一个闪烁的LED告诉我它的运行,但这并不理想.
我已经阅读过有关使用MONIT的信息,但我遇到了一些问题.到目前为止,我的尝试主要围绕这个解决方案:
https://*.com/questions/23454344/use-monit-monitor-a-python-program
这是我的bash包装文件,名为/home/pi/UPSalarm/UPSalarm.bash
#!/bin/bash
PIDFILE=/var/run/UPSalarm.pid
case $1 in
start)
#source /home
#Launch script
sudo python /home/pi/UPSAlarm/UPSalarm.py 2>/dev/null &
# store PID value
echo $! > ${PIDFILE}
;;
stop)
kill `cat ${PIDFILE}`
# Proccess killed, now remove PID
rm ${PIDFILE}
;;
*)
echo "usage: scraper {start|stop}" ;;
esac
exit 0`
这是我的*规则
check process UPSalarm with pidfile /var/run/UPSalarm.pid
start = "/home/pi/UPSalarm/UPSalarm start"
stop = "/home/pi/UPSalarm/UPSalarm stop"
我有两个问题:首先,我在UPSalarm.pid中得到错误的PID号.我想知道我是否得到了sudo的PID号码?这就是我在这里发布问题的原因;我需要sudo因为我需要访问GPIO端口.其次,它不起作用.第三,我不确定bash文件中的源代码是什么?
我知道monit有很好的文档,但是python的一个有用的例子确实会有所帮助,我已经被困了好几天了.
以下网站也很有帮助:
https://www.the-hawkes.de/monitor-your-raspberrypi-with-monit.html(用于设置monit)
https://mmonit.com/monit/documentation/monit.html
这两个问题是相关的,但没有解决我的问题:
https://raspberrypi.stackexchange.com/questions/9938/monitoring-a-python-script-running-in-a-screen-session-with-monit
How to restart the Python script automatically if it is killed or dies
解决方法:
那个shell包装器看起来像一个init脚本,但显然它不是(因此你需要在那里使用sudo; init运行的脚本不需要这个).
这似乎是一种非常笨拙的方式来做到这一点; shell包装器不能用于python程序本身无法提供的任何目的.摆脱它;如果你想要一个特定的初始化脚本,写一个最小的脚本,但我建议你将控制守护进程的逻辑从init脚本转移到守护进程(UPSalarm.py)本身.
由于您只需要一个实例,因此请定义该进程要使用的pid文件.运行UPSalarm.py start时,它将检查是否存在此文件.如果它不存在,它会将自己的pid写入此文件并继续.如果确实存在,则获取pid,然后检查操作系统以查看是否存在具有pid的进程,如果存在,则调用它.这将证明UPSalarm.py已经运行或未运行.如果是,请退出“已经运行”消息.
当运行UPSalarm.py stop时,会涉及类似的序列 – 检查pid文件,如果存在则检查pid,如果pid对名为UPSalarm.py的进程有效,则发出信号停止,可能是SIGINT. UPSalarm.py本身应该为SIGINT实现一个信号处理程序,这样它就会在pid文件退出之前删除它.
我不是一个python程序员,这不是一个编程站点(为此,见Stack Overflow),但我保证所有这一切都很容易用python.
>获得当前流程的pid,use os.getpid()
.
>为了将pid映射到进程名称,请读取/ proc / [pid] / cmdline并对UPSalarm.py进行字符串搜索(或者更好的是,调用进程的名称,即sys.argv [0],见here).
>对于信号处理,请从here和here开始.
>向另一个进程发送信号,use os.kill()
.
然后应该很容易配置monit来处理这个守护进程.然后你也可以选择使用cron(或你自己的脚本)来调用UPSalarm.py,每隔5-10分钟调用一次.