Aar*_*ron 6 monitoring sudo python gpio
我有一个守护进程,它使用 GPIO 端口监视各种事物。我已经使用 Python 使用 RPi.GPIO 模块为此编写了代码。
我想确保守护进程始终运行,即在崩溃后重新启动它并在系统启动时启动它(至关重要的是在任何用户登录之前——这个 Pi 无头运行)。有一个闪烁的 LED 告诉我它正在运行,但这并不理想。
我已阅读有关为此目的使用 MONIT 的信息,但我遇到了一些问题。到目前为止,我的尝试主要围绕这个解决方案:
这是我的 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`
Run Code Online (Sandbox Code Playgroud)
这是我的监控规则
check process UPSalarm with pidfile /var/run/UPSalarm.pid
start = "/home/pi/UPSalarm/UPSalarm start"
stop = "/home/pi/UPSalarm/UPSalarm stop"
Run Code Online (Sandbox Code Playgroud)
我有两个问题:首先,我在 UPSalarm.pid 中得到了错误的 PID 编号。我想知道我是否获得了 sudo 的 PID 号?这就是我在这里发布问题的原因;我需要 sudo,因为我需要访问 GPIO 端口。其次,它不起作用。第三,我不确定source
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如何如果 Python 脚本被杀死或死亡,则自动重新启动它
该 shell 包装器看起来像一个 init 脚本,但显然它不是(因此您需要在sudo
那里使用;由 init 运行的脚本不需要这个)。
这似乎是一种非常笨拙的方法;shell 包装器不用于任何python程序本身无法更好地提供的目的。摆脱它;如果您特别想要一个 init 脚本,请编写一个最小的脚本,但我建议您将控制守护程序的逻辑从 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 轻松实现。
os.getpid()
./proc/[pid]/cmdline
并进行字符串搜索UPSalarm.py
(或者更好的是,调用进程的名称,即sys.argv[0]
,请参阅此处)。os.kill()
.然后配置monit
来处理这个守护进程应该很容易。然后,您还可以选择使用cron
(或您自己的脚本)UPSalarm.py start
每隔一段时间调用一次,比如每 5-10 分钟一次。
归档时间: |
|
查看次数: |
797 次 |
最近记录: |