Bashスクリプトは、Pythonスクリプトが画面上で実行されていることを確認します。それ以外の場合は再起動します。

Bashスクリプトは、Pythonスクリプトが画面上で実行されていることを確認します。それ以外の場合は再起動します。

こんにちは、私は現在2つの別々の画面で5つのPythonプロセスを起動し、私のPythonスクリプトが現在実行中であることを確認し、それ以外の場合は再起動するbashスクリプトを設定しようとしています。合計5つのPythonスクリプトがあります。ある画面では4つのスクリプトが実行されており、もう一方の画面では1つのスクリプトが実行されています。私はLinuxとスクリプトに初めて触れたので、小さな間違いがあったらと思います。私は現在それらをすべて殺して、そのうちの1つが停止したら、画面から再起動したいと思います。これは私の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が時々Pythonプロセスを終了しないことを知っていました。

どんな助けでも大変感謝します。ありがとうございます。

ベストアンサー1

私はおそらく以下に説明することをします。これにより、各スクリーンインスタンスに対して個別の監視スクリプトが生成されるため、スクリーンインスタンスを完全に再起動する必要がなくなり、.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

おすすめ記事