在 Pi 上執行涉及 GPIO 的守護程序
我有一個使用 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 埠。其次,它不起作用。第三,我不確定
source
bash 文件中的內容是什麼?我知道 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 分鐘呼叫一次。