Existe uma maneira de executar um script a cada minuto (ou 2 ou 5, etc), mas apenas se ele ainda não estiver em execução?
Temos um conjunto de scripts que precisam ser executados a cada minuto. Às vezes, eles podem começar e terminar em um segundo, outras vezes, podem durar 5 minutos.
Nossa maneira atual de evitar execuções simultâneas é definir um is_running
sinalizador em cada script e sair se ele ainda estiver ativado. Mas isso é um pouco confiável (ou seja, erros fatais causariam o sinalizador permanecer ativado mesmo após a interrupção do script).
Poderíamos escrever nosso próprio gerente, mas estou me perguntando se já existe uma solução mais elegante.
Respostas:
uma maneira melhor é usar em
flock
vez de um pidfile. verifique a página de manual: flock (1) . A vantagem é que, não importa como um processo termine / morra, a trava será removida.fonte
Eu tenderia a concordar com a resposta de arquivo pid da Warner. No entanto, o seguinte recurso da Anacron faz isso?
Eu mesmo não testei, não acho a documentação da anacron completa o suficiente ...
Se você quer ser particularmente preguiçoso ;-) Você pode apenas ter o script finalizado se percorrer o ps output retornar o processo como em execução. Mas um arquivo lock / pid é o melhor.
fonte
anacron
e o quecron
fazer, mas eles resolvem problemas diferentes. Usandocron
, como você iniciaria um trabalho que foi perdido porque uma máquina estava inoperante? Usandoanacron
, como você começaria um trabalho todo dia 25 de dezembro ou a cada 5 minutos? (Você pode, é claro, soluções alternativas de script, mas não é disso que estou falando.)anacron
não é executado em períodos inferiores a um dia.Essa é a solução adequada para essa abordagem. Normalmente, um arquivo pid seria usado e um teste pid seria feito no processo para garantir a execução. Se obsoleto, o arquivo de bloqueio seria removido e o processo seria executado de qualquer maneira.
Qualquer inteligência adicional normalmente seria escrita no próprio software, como um daemon, em vez de ser executada no cron.
fonte
Se seus scripts estiverem codificados em um idioma que suporte o syscall do flock (2), você poderá agrupar () um arquivo de bloqueio com uma chamada de função também. Exemplo:
Se você está preso ao Bash ou a outra linguagem de script que não suporta isso, a solução já proposta com o flock (1) também está correta.
PS De qualquer forma, você deve criar um arquivo de bloqueio separado apenas uma vez (se ainda não existir) e nunca excluí-lo. O diretório "/ var / lock" é um bom local para esses arquivos.
fonte
Esta é uma solução se o seu script for executado em python (ou você pode criar um comando python para executar antes do próximo comando) - Encontrei exatamente esse problema na semana passada e, embora tenha encontrado boas soluções, decidi fazer uma solução muito pacote python simples e limpo e o carregou para o PyPI. Você certamente poderia bloquear
__file__
para não ter que pensar em dar a ele um nome de recurso personalizado para bloquear.Instale com:
pip install quicklock
Usá-lo é extremamente simples:
Dê uma olhada: https://pypi.python.org/pypi/quicklock
fonte