Como posso executar um comando periodicamente e indefinidamente até que ele seja desativado?

0

Eu quero executar um comando a cada vários minutos até que eu o desligue.

Depois de algumas pesquisas, encontrei muitas maneiras de fazer a primeira metade (executando um comando periodicamente e indefinidamente), que tal eu querer desativá-lo?

Editar
Por "desligá-lo", provavelmente, quero dizer "desligue-o usando outro comando shell".

Editar
Só para esclarecer o que eu realmente quero fazer, na verdade eu quero rodar um programa Python P periodicamente até eu dar um comando para pará-lo.
E apenas no caso em que P esteja em execução enquanto estou dando o comando stop, eu quero que ele termine a corrida atual primeiro, e então não corra desde então.

    
por dontloo 28.06.2016 / 10:10

4 respostas

1

Você tem duas opções: Modificar o script Python ou escrever um wrapper de script de shell.

Para modificar o script Python:

  1. Você deve dar uma volta em torno do que você quer fazer.

  2. Instale um manipulador de sinal para capturar o sinal INT (enviado por Ctrl - C ) e TERM signal (enviado por plain kill ). 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.

    
por 28.06.2016 / 11:31
1

Você pode tentar usar um watch 'loop' para executar o programa repetidamente e ver o resultado, ou um while loop. Obtenha o PID desse processo com echo $! e use kill para finalizar esse PID. Por exemplo:

while :; do ./test.py; done & echo $! > /tmp/testpy.pid

Use kill para finalizar o programa quando quiser:

kill -9 'cat /tmp/testpy.pid'
    
por 28.06.2016 / 10:53
1

Você pode criar uma tarefa cron para executar seu comando regularmente. Por exemplo, se você quiser executar o trabalho a cada hora, crie a seguinte tarefa cron:

0 * * * * /path/to/your/command >/dev/null 2>&1

Se você quiser parar a execução do tipo de trabalho ps aufx|grep yourcommand|grep -v e matar o pid dele.

    
por 28.06.2016 / 10:55
-1

Você pode pressionar CTRL + c ou enviar o sinal SIGTERM com kill ou killall .

    
por 28.06.2016 / 10:21