Bash

用於檢查 python 腳本是否在螢幕中執行的 Bash 腳本 - 如果沒有則重新啟動

  • December 6, 2017

您好,所以我目前正在嘗試設置一個 bash 腳本,該腳本在 2 個單獨的螢幕中啟動 5 個 python 程序,然後檢查我的 python 腳本目前是否正在執行,如果沒有則重新啟動它們。總共有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 的原因,因為它會向我發送一封失敗的電子郵件。我使用 num_procs = 7 因為有 5 個 python 程序和 2 個螢幕。由於某種原因,螢幕也計入 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

我嘗試在該地方使用迴聲來查看程式碼到達和卡住的位置,但是在完成最初啟動螢幕後,我發現甚至沒有迴聲工作。如果我只殺死了 1 個 python 腳本,while 循環似乎也不起作用,但如果我把它們全部殺死,它會起作用並重新啟動。迴聲和while循環是否會在分離的螢幕或其他東西中失去,直到我殺死所有程序?我還注意到 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

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