こんにちは。現在、5つのpythonプロセスを2つの別々の画面で開始し、pythonスクリプトが現在実行されているかどうかを確認するbashスクリプトを設定しようとしています。 、そうでない場合は再起動します。5つのpythonスクリプトがすべて一緒にあります。4つのスクリプトが1つの画面で実行され、1つのスクリプトが別の画面で実行されます。Linuxとスクリプトは初めてなので、ちょっとしたミスをしたことを願っています。現在、すべてを強制終了し、いずれかが停止した場合は画面ですべてを再起動しようとしています。これが私のbashスクリプトです。
#!/bin/bash
screen -dm -S "screen1" python script1.py
screen -dm -S "screen2" python script2.py & python script3.py & python script4.py & python script5.py
while true; do
num_procs=$(pgrep -lf python | wc -l)
if [ "$num_procs" != "7" ]; then
pkill python
screen -dm -S "fail" python script_failed.py
sleep 10
pkill python
screen -dm -S "screen1" python script1.py
screen -dm -S "screen2" python script2.py & python script3.py & python script4.py & python script5.py
fi
sleep 20
done
また、コードが失敗した場合に通知を受け取り、失敗した理由をさかのぼることができます。そのため、失敗したというメールが送信されるため、script_failed.pyを開始します。 5つのpythonプロセスと2つの画面があるため、num_procs = 7を使用しました。何らかの理由で、画面もnum_procsにカウントされます。以下のpgrep -af pythonの出力を参照してください。
1146 SCREEN -dm -S screen1 python scrip1.py
1148 python script1.py
1154 python script3.py
1155 python script4.py
1156 python script5.py
1157 SCREEN -dm -S screen2 python script2.py
1158 python script2.py
その場所の周りでエコーを使用して、コードがどこに到達してスタックしているのかを確認しようとしましたが、最初に画面を開始した後でもエコーが機能しないことがわかりました。また、pythonスクリプトを1つだけ強制終了した場合、whileループは機能しないようですが、すべてを強制終了すると、機能して再起動します。エコーとwhileループが発生する可能性があります。すべてのプロセスをpkillするまで、切り離された画面などで失われましたか?pkillがpythonプロセスを強制終了しない場合があることにも気づきました。
どんな助けでもいただければ幸いです。ありがとう。
私はおそらく以下に概説したようなことをするでしょう。これにより、画面インスタンスごとに個別のウォッチドッグスクリプトが作成されるため、画面インスタンスを完全に再起動する必要はありません。pidファイルを使用すると、スクリプトがまだ実行されているかどうかをより正確に確認できます。
各pythonスクリプト(1-5)を編集して.pidファイルを作成します(例: https://stackoverflow.com/a/789383/5670331 )
メインスクリプトを編集します。
#!/bin/bash
screen -dm -S "screen1" watchdog1.sh
screen -dm -S "screen2" watchdog2.sh
watchdog1.sh
while true; do
sleep 10
ps up `cat /tmp/python_script_1.pid` >/dev/null && echo "Script 1 is running" || python script1.py &
done
watchdog2.sh
while true; do
sleep 10
ps up `cat /tmp/python_script_2.pid` >/dev/null && echo "Script 2 is running" || python script2.py &
ps up `cat /tmp/python_script_3.pid` >/dev/null && echo "Script 3 is running" || python script3.py &
ps up `cat /tmp/python_script_4.pid` >/dev/null && echo "Script 4 is running" || python script4.py &
ps up `cat /tmp/python_script_5.pid` >/dev/null && echo "Script 5 is running" || python script5.py &
done