Você tem duas opções: Modificar o script Python ou escrever um wrapper de script de shell.
Para modificar o script Python:
-
Você deve dar uma volta em torno do que você quer fazer.
-
Instale um manipulador de sinal para capturar o sinal
INT
(enviado por Ctrl - C ) eTERM
signal (enviado por plainkill
). Quando o sinal for capturado, defina uma variável informando ao script Python que ele não deve mais ser executado em loop. Eu não estou familiarizado o suficiente com o Python para poder lhe dizer como fazer isso.
Solução alternativa: wrapper de script de shell, que faz o mesmo que o acima, mas fora do script Python:
#!/bin/sh
loop_again=1
trap 'loop_again=0;wait' INT TERM
while (( loop_again )); do
echo "Kill me with 'kill -9 $$'"
./python_script &
echo "Kill the Python script with 'kill $!'"
wait
done
Este script de wrapper inicia seu script Python em segundo plano e aguarda que ele termine. Em seguida, reinicia-o indefinidamente. Também informa como terminá-lo e o script Python em cada iteração.
Se você kill
o script (usando% normalkill
, não kill -9
), ou pressione Ctrl - C , a variável loop_again
é definida como zero (o que fará com que o loop seja encerrado no final da iteração atual) e, em seguida, aguarda que o processo de segundo plano em execução no momento seja concluído antes de sair.
Se você matar o script wrapper com kill -9
(que é o mesmo que kill -s KILL
, enviando um sinal KILL
que não pode ser ignorado ou capturado por um manipulador de sinal), ele sairá, deixando seu Python script em execução em segundo plano até terminar sozinho.