在Pi上运行涉及GPIO的守护进程

我有一个使用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).
>对于信号处理,请从herehere开始.
>向另一个进程发送信号,use os.kill().

然后应该很容易配置monit来处理这个守护进程.然后你也可以选择使用cron(或你自己的脚本)来调用UPSalarm.py,每隔5-10分钟调用一次.

上一篇:linux – 查看Postgresql内存使用情况


下一篇:Process Monitor相当于Linux?