Execute vários trabalhos cron em que um trabalho leva muito tempo

16

Eu tenho a seguinte pergunta geral sobre tarefas cron.

Suponha que eu tenha o seguinte no meu crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

É inteligente o suficiente para executar os trabalhos restantes nos momentos apropriados? Por exemplo, o script longo não precisa terminar?

Além disso, o que acontece se o script longo inicial ainda estiver em execução e for chamado pelo cron novamente?

Obrigado!

user1357015
fonte
Cron não se importa com quanto tempo os trabalhos são executados; ele executará cópias adicionais.
Jeff Schaller
Verifique se suas perguntas estão formatadas corretamente.
Bram

Respostas:

31

Cada trabalho cron é executado independentemente de qualquer outro trabalho que você possa ter especificado. Isso significa que seu script de longa duração não impedirá que outros trabalhos sejam executados no horário especificado.

Se qualquer um dos seus scripts são ainda executar na sua próxima intervalo cron programado, depois outra, em simultâneo, a instância do seu script será executado.

Isso pode ter consequências imprevistas, dependendo do que o seu script faz. Eu recomendaria a leitura do artigo da Wikipedia sobre Bloqueio de arquivos , especificamente a seção Bloquear arquivos . Um arquivo de bloqueio é um mecanismo simples para sinalizar que um recurso - no seu caso, o someScript3.shscript - está atualmente 'bloqueado' (isto é, em uso) e não deve ser executado novamente até que o arquivo de bloqueio seja removido.

Dê uma olhada nas respostas para a seguinte pergunta para obter detalhes de maneiras de implementar um arquivo de bloqueio no seu script:

soulcake
fonte
8

Não sei ao certo o que você quer dizer com o tempo apropriado. O Cron iniciará os trabalhos no horário agendado. Ele não verifica outros trabalhos agendados nem outras instâncias de um trabalho.

Portanto, quaisquer trabalhos válidos que você definir serão iniciados no horário definido. Qualquer trabalho que seja executado mais longo que o intervalo definido será iniciado várias vezes. É de responsabilidade de quem escreveu o trabalho impedir que ele seja executado várias vezes, se necessário. Por exemplo, verificando um arquivo de bloqueio ou arquivo PID ou algo assim.

Existem limitações óbvias à quantidade de processos que podem ser executados em paralelo, mas esses não são específicos do cron.

Bram
fonte
6

Além de outras respostas, especialmente o link postado por @soulcake: Se você agendar um comando de execução longa com um intervalo muito curto, o cron executará o segundo antes da conclusão do primeiro (a menos que haja algum tipo de mutex implementado no comando) .

Isso geralmente diminui ainda mais o comando original, levando a outra instância a ser executada antes da conclusão das anteriores, etc. Ou pode ser indesejável por outros motivos.

A maneira geral de impedir é condicionar a execução do comando com uma proteção que garanta que um comando anterior não esteja sendo executado. Por exemplo:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Certifique-se de que o pgrep corresponda ao nome do comando quando ele for executado, por exemplo, scripts python têm python como o nome do executável, o que provavelmente não é específico o suficiente e você também deve comparar o nome do script do python.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(a opção pgrep sem '-f' corresponde aos nomes dos scripts bash)

Se você não pode usar o pgrep por algum motivo:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Os colchetes são usados ​​para evitar a correspondência com o próprio comando grep.

Edheldil
fonte
0

Eu uso flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
JohnMudd
fonte