Como evitar o processo de execução do CronJob duas vezes?

4

Eu tenho um script Cron Job que é executado a cada 4 minutos. Em casos raros, o script não é concluído em 4 minutos. Isso causa problemas.

Como posso executar uma verificação de que, se o script anterior não estiver concluído, ignore a execução atual

Comportamento esperado:

10:00 : Script A starts
10:04 : Script A2 starts - it finds that script A was not finish so this script aborts. Simply finish without doing nothing.
10:06 : Script A finish 
10:08 : Script A3 starts - no other scripts running so it continue

Aviso: A, A2, A3 são o mesmo script (apenas em momentos diferentes)! Não deve considerar outros scripts que possam estar em execução também

    
por avi 16.05.2017 / 12:47

1 resposta

6

Existem duas abordagens principais:

  1. faça o script sair se detectar outra instância em execução. Basta adicionar essas linhas ao início do seu script:

    if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
         echo "Another instance of the script is running. Aborting."
         exit
    fi
    

    $0 é o nome do script e ${0##*/} é o nome do script com tudo até o último / removido (portanto, /path/to/script.sh se torna script.sh ). Isso significa que, se você tiver outro script não relacionado com o mesmo nome em execução, ele ainda será detectado. por outro lado, isso também significa que ele funcionará mesmo se você chamar o script de um link simbólico. Qual você prefere depende do seu caso de uso.

  2. Use um arquivo de bloqueio e saia do script se o arquivo existir:

    #!/bin/bash
    
    if [ -e "/tmp/i.am.running" ]; then
        echo "Another instance of the script is running. Aborting."
        exit
    fi
    else
        touch  "/tmp/i.am.running"
    fi
    
    ## The rest of the script goes here
    
    rm "/tmp/i.am.running"
    
por terdon 16.05.2017 / 14:36

Tags