Killing um processo cron e impedindo-o de relançar

1

Eu tenho uma entrada no cron que fica presa e da qual não consigo sair. A tarefa cron inicia um script que executa nossas tarefas noturnas para o nosso sistema de aplicativos. O script envia tarefas assíncronas no agendador de tarefas do nosso sistema de aplicativos. Temos algumas etapas que exigem a conclusão da conclusão antes de passar para o próximo trabalho. Para controlar isso, testamos o código de retorno do servidor de aplicativos. Se o status do trabalho for maior que 59, ele ainda estará em execução. Daí o seguinte código (não há nenhum comando "getjobstatus", mas assume que ele retorna um valor numérico para jobstatus abaixo):

jobstatus=0
while [[ $jobstatus -lt 60 ]]
do
   sleep 5
   jobstatus='getstatus whatever'
done

Eu tentei matar o processo "sleep", mas ele continua voltando. Como faço para evitar isso e matá-lo para sempre?

    
por Leon 21.08.2017 / 20:00

3 respostas

1

Como Deathgrip mencionou em um comentário, você deve matar o processo pai de sleep , que você pode encontrar com alguma variação de ps | grep sleep ( ps tem muitas implementações, então não vou adivinhar exatamente quais bandeiras você precisa para fornecer ou com o que sua saída se parece. Verifique man ps )

O que está acontecendo? Quando você mata sleep , ele termina, mas isso não afeta a execução do script que contém ... ele simplesmente passa para a próxima linha e o loop continua em loop. Existem algumas maneiras que você pode modificar o script para que o sono funcione. Um dos mais simples é fazer isso: sleep 5 || exit .

Como alternativa, se você estiver usando o Bash (outros?), basta adicionar essa linha no começo: set -e . Isso diz ao Bash para encerrar o script se algum comando dentro falhar (isto é, retornar um status diferente de zero). Mas isso afeta tudo em seu script e tem várias outras armadilhas, então é melhor evitar essa solução. (Você pode adicionar set -e na linha antes de dormir e desabilitar com set +e imediatamente depois, mas isso está ficando meio ridículo, já que você pode usar a primeira solução que mencionei.)

    
por 22.08.2017 / 01:40
1

Se você tem um processo de sleep em sua mira, e esse processo de suspensão é parte de um script de shell pai executado em um loop, como você tem, então você terá que matar esse processo pai para evitar isso ( particular) o comando sleep foi iniciado novamente.

Pegue o PID desse processo de suspensão e encontre o processo pai, depois o mate:

$ ps -e -opid,comm,args|grep sleep
424241 sleep  sleep 999 # for example
$ ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE
424242 # for example
$ kill $(ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE)
    
por 23.08.2017 / 17:48
-1

Eu acho que você pode querer algo assim: Como parar o script de loop bash no terminal?

Então, no seu caso, se você usar SIGTERM ao invés de INT, já que como um cron job, estou assumindo que você está tentando matá-lo com "kill" em vez de ctrl + C:

jobstatus=0
trap "exit" SIGTERM
while [[ $jobstatus -lt 60 ]]
do
    sleep 5
    jobstatus='getstatus whatever'
done

Deve permitir que todo o script seja eliminado em vez de apenas os comandos de suspensão

Desculpe por fazer disso uma resposta separada, em vez de apenas um comentário, mas ainda não tenho pontos suficientes para deixar comentários.

    
por 22.08.2017 / 00:00

Tags