Evitando duplicações de tarefas cron [duplicadas]

1

Eu encontrei esta página interessante que sugere várias opções:

  1. Crie um arquivo de bloqueio
  2. Crie um arquivo PID.
  3. flock
  4. solo

Mas e a sua opção:

Verifique ps para ver se o comando executado está sendo executado no momento.

(Um script ps-check.sh pode até ser incluído no início de cada tarefa do cron que você criar.)

Estou assumindo que a razão pela qual eu não encontrei esse tipo de solução é que é uma má idéia.

Por que isso é uma má ideia?

ps-check.sh pode retornar 1 se o comando já estiver em execução. O script cron poderia chamar ps-check.sh assim:

#!/bin/bash
#some script

#get current script name into variable
#then use ps-check.sh to see if current script is already running
#by supplying it with 2 things: script name and current PID
me='basename "$0"'    
if (( $(ps-check.sh $me $$) == 1)); then
  exit 1;
fi
# do more stuff

ps-check.sh verificaria se o script já estava sendo executado em outro PID.

Existe algum caso em que um script esteja em execução, mas não visível em ps ? Se dorme?

EDIT - Conclusão:

Eu decidi usar flock . Verificar ps poderia funcionar, mas provavelmente teria que lidar com muitas condições para ter certeza. Eu suponho que flock já lida com a maioria deles.

    
por Buttle Butkus 27.06.2017 / 02:14

2 respostas

2

A falha no uso da lógica ps é que você espera que um processo nome seja exclusivo.

A menos que você sempre inicie seus processos com um caminho absoluto, um usuário diferente (ou você mesmo) pode facilmente criar um processo completamente diferente com o mesmo nome que impediria a execução do trabalho do cron.

    
por 27.06.2017 / 07:06
1

Eu recomendaria usar o comando executar um - muito mais simples do que lidar com as fechaduras. Dos documentos:

run-one é um script de wrapper que executa não mais do que uma instância exclusiva de algum comando com um conjunto exclusivo de argumentos. Isso geralmente é útil com cronjobs, quando você não deseja mais do que uma cópia de cada vez.

run-this-one é exatamente como run-one, exceto que ele usará pgrep e kill para localizar e eliminar qualquer processo em execução de propriedade do usuário e combinando os comandos e argumentos de destino. Observe que run-one-one bloqueará ao tentar matar os processos correspondentes, até que todos os correspondentes processos estão mortos.

run-one-constant opera exatamente como o run-one, exceto que respawns "COMMAND [ARGS]" sempre que o comando COMMAND sair (zero ou diferente de zero).

keep-one-running é um apelido para o run-one-constantement.

run-one-until-success opera exatamente como o run-one-constant, exceto que ele reaparece "COMMAND [ARGS]" até o COMMAND sair com sucesso (ou seja, sai em zero).

run-one-until-failure opera exatamente como o run-one-constant, exceto que ele reaparece "COMMAND [ARGS]" até que o COMMAND saia com falha (isto é, sai diferente de zero).

    
por 03.10.2017 / 00:23