Gpio

在 Pi 上執行涉及 GPIO 的守護程序

  • August 31, 2018

我有一個使用 GPIO 埠監視各種事物的守護程序。我已經使用 python 使用 RPi.GPIO 模組為此編寫程式碼。

我想確保守護程序始終在執行,即在崩潰後重新啟動它並在系統啟動時啟動它(在任何使用者登錄之前至關重要——這個 Pi 無頭執行)。有一個小閃爍的 LED 告訴我它正在執行,但這並不理想。

我已經閱讀了有關為此目的使用 MONIT 的資訊,但我遇到了一些問題。到目前為止,我的嘗試主要圍繞這個解決方案:

https://stackoverflow.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 埠。其次,它不起作用。第三,我不確定sourcebash 文件中的內容是什麼?

我知道 monit 有很好的文件,但是一個適用於 python 的範例真的會很有幫助,我已經被困了好幾天了。

以下網站也很有幫助: https : //www.the-hawkes.de/monitor-your-raspberrypi-with-monit.html(用於設置監視器) 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 腳本被殺死或死亡,則自動重新啟動它

該外殼包裝器看起來像一個 init 腳本,但顯然不是(因此您需要在sudo那裡使用;由 init 執行的腳本不需要這個)。

這似乎是一種非常笨拙的方法;shell 包裝器不用於任何 python 程序本身無法更好地服務的目的。擺脫它;如果你特別想要一個初始化腳本,寫一個最小的,但我建議你把控制守護程序的邏輯從初始化腳本移到守護程序(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,請使用os.getpid().
  • 要將 pid 映射到程序名稱,請讀取/proc/[pid]/cmdline並執行字元串搜尋UPSalarm.py(或者更好的是,呼叫程序的名稱,這將是sys.argv[0],請參見此處)。
  • 對於信號處理,從這里這裡開始。
  • 要將信號發送到另一個程序,請使用os.kill().

monit然後配置來處理這個守護程序應該很容易。然後,您還可以選擇只使用cron(或您自己的腳本)UPSalarm.py start每隔 5-10 分鐘呼叫一次。

引用自:https://unix.stackexchange.com/questions/218616