Script Bash para verificar se os scripts python estão sendo executados nas telas - reinicie se não

1

Olá, atualmente estou tentando configurar um script bash que inicie 5 processos python em duas telas separadas e, em seguida, verifique se meus scripts python estão sendo executados e reinicie-os, se não estiverem. Existem 5 scripts python juntos. 4 scripts são executados em 1 tela e 1 script em outro. Eu sou novo no Linux e scripts, então eu estou esperando que eu tenha cometido um pequeno erro. No momento, estou apenas tentando matar todos eles e, em seguida, reinicie-os em todas as telas, caso algum deles tenha parado. Aqui está meu script 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

Eu também quero ser notificado se meu código falhar para que eu possa refazer o motivo, e é por isso que eu inicio o script_failed.py porque ele me envia um email que falhou. Eu usei num_procs = 7 porque há 5 processos python e 2 telas. Por algum motivo, as telas também contam para os num_procs. Como você pode ver abaixo na minha saída para 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

Eu tentei usar echos em todo o lugar para ver para onde o código estava indo e ficar preso, mas não encontrei nenhum trabalho nem mesmo depois que comecei a fazer as telas. Além disso, o loop while parece não funcionar se eu matei apenas 1 dos scripts python, mas se eu matar todos ele funciona e reinicia. Será que os ecos e o loop while poderiam se perder em uma tela separada ou algo assim até eu processar todo o processo? Eu também notei que pkill às vezes não mata os processos python.

Qualquer ajuda seria apreciada. Obrigado.

    
por Noah Sark 06.12.2017 / 03:36

1 resposta

0

Eu provavelmente faria algo parecido com o que descrevi abaixo. Isso criará um script watchdog separado para cada instância da tela, para que você não precise reiniciar completamente as instâncias da tela e, ao usar arquivos .pid, permitiria uma verificação mais precisa de que os scripts ainda estão em execução.

Edite cada script python (1-5) para criar um arquivo .pid (exemplo: link )

Edite o script principal:

#!/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
    
por 06.12.2017 / 03:53