GPIOポートを使用してさまざまなものを監視するデーモンがあります。私はRPi.GPIOモジュールを使ってPythonを使ってそれのコードを書いた。
デーモンが常に実行されていることを確認したいと思います。つまり、クラッシュ後に再起動し、システムの起動時に起動します(ユーザーがログインする前に - このPiはヘッドレスで実行されます)。点滅しているLEDインジケータが動作していることを知らせますが、理想的ではありません。
これを達成するためにMONITを使用する方法について読んだが、いくつかの問題が発生しました。これまで私の試みは主にこのソリューションを中心に行われてきました。
https://stackoverflow.com/questions/23454344/use-monit-monitor-a-python-program
これは /home/pi/UPSalarm/UPSalarm.bash という 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"
2つの問題があります。まず、UPSalarm.pidに無効なPID番号があります。 sudoのPID番号を取得できるかどうかを知りたいです。これが私がこの質問をここに投稿する理由です。 GPIOポートにアクセスする必要があるため、sudoが必要です。第二に、動作しません。第三に、source
bashファイルに何があるのかわかりません。
私はmonitが良いドキュメントを持っていることを知っていますが、Pythonの実際の例は本当に役に立ちます。私は数日間閉じ込められていました。
次のウェブサイトも役立ちます。 https://www.the-hawkes.de/monitor-your-raspberrypi-with-monit.html(モニタ設定用) https://mmonit.com/monit/documentation/monit.html
これら2つの質問は関連していますが、私の問題を解決していません。 https://raspberrypi.stackexchange.com/questions/9938/monitoring-a-python-script-running-in-a-screen-session-with-monit Pythonスクリプトが終了または終了した場合に自動的に再起動する方法
答え1
このシェルラッパーはinitスクリプトのように見えますが、明らかにそうではありません(それでそこで使用する必要がありますsudo
。initによって実行されるスクリプトにはこれは必要ありません)。
これは非常に不器用なアプローチのように見えます。シェルラッパーは、Pythonプログラム自体がより良い機能を提供できない目的を提供しません。これを削除します。特にinitスクリプトが必要な場合は、最小限のスクリプトを作成してください。ただし、デーモンを制御するロジックをinitスクリプトからデーモン(UPSalarm.py
)自体に移動することをお勧めします。
1つのインスタンスのみが必要なので、プロセスで使用するpidファイルを定義します。実行すると、UPSalarm.py start
ファイルが存在することを確認します。存在しない場合は、ファイルに独自のpidを書き込んで続行します。存在する場合は pid をインポートし、OS をチェックして、その pid を持つプロセスがあるかどうか、その場合はプロセス名が何であるかを確認します。これはUPSalarm.py
すでに実行中かどうかを証明します。その場合、「実行中」というメッセージで終了します。
を実行すると、UPSalarm.py stop
同様のシーケンスが含まれます。 pidファイルがあることを確認し、pidが名前付きプロセスに対して有効であることを確認し、UPSalarm.py
停止信号を発行しますSIGINT
。おそらくを使用してUPSalarm.py
信号ハンドラを実装する必要がありますSIGINT
。 pidファイルを終了する前に削除されました。
私はPythonプログラマーでもなく、プログラミングのウェブサイトでもありません。スタックオーバーフロー)、しかし私はこれがPythonで簡単に可能であると約束します。
- 現在のプロセスのpidを取得するには、使用
os.getpid()
。 - pidをプロセス名にマッピングするには、
/proc/[pid]/cmdline
文字列の検索UPSalarm.py
(またはより良い方法は呼び出しのプロセス名)を読んで実行しますsys.argv[0]
。ここ)。 - 信号処理のために開始ここそしてここ。
- 他のプロセスに信号を送信するには使用
os.kill()
。
これにより、このデーモンを処理するように設定が簡単になりますmonit
。その後、(または独自のスクリプト)を使用して、時々cron
(たとえば5〜10分ごとに)呼び出すこともできます。UPSalarm.py start