Aguardar a conclusão da execução anterior do script de shell

1

Eu preciso executar um script de shell a cada hora. No entanto, não quero começar a próxima corrida até que a anterior esteja completa.

Por favor, informe.

    
por puneet gupta 04.11.2017 / 16:06

3 respostas

2

Como você marcou a pergunta como Linux, você pode usar flock para bloquear um arquivo conhecido:

flock "${TMPDIR:-/tmp}"/some_name.lock /path/to/your_command -options

Uma segunda instância do comando (executada da mesma maneira) aguardará até que a primeira instância termine. O problema dessa abordagem é que, se o comando levar mais de uma hora, você acumulará mais e mais instâncias aguardando o bloqueio.

Como alternativa, você pode simplesmente ignorar a execução de uma segunda instância, se a primeira não tiver terminado:

flock -n "${TMPDIR:-/tmp}"/some_name.lock /path/to/your_command -options

O problema com essa abordagem é que você pode executar o comando menos que 24 vezes por dia.

    
por 04.11.2017 / 16:33
1

Você precisa definir melhor seu problema.

Sato descreveu como um método em que novas instâncias farão backup de uma atrasada.

A solução de Jaroslav apenas fornece um mecanismo para detectar que a instância anterior ainda não terminou de forma limpa.

Outra opção seria agendar a próxima instância do script dentro do próprio script:

at now + 1 hour $*

Você precisa definir o comportamento se a instância anterior não foi concluída e se deseja que as instâncias iniciem em intervalos de uma hora ou dentro de um intervalo definido entre a conclusão e o início.

    
por 04.11.2017 / 17:16
0

Você pode criar um arquivo temporário no início do script e excluí-lo antes do fechamento do script. O script deve verificar a existência desse arquivo. Se encontrar, ele apenas fecharia e não faria nada. Se não, crie e continue.

Ou no cron job, você pode usar o pgrep para verificar o script que está sendo executado e continuar somente se isso não acontecer.

    
por 04.11.2017 / 16:18