Execute várias tarefas cron onde um trabalho leva muito tempo

15

Eu tenho a seguinte pergunta geral sobre os trabalhos agendados.

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 novamente pelo cron?

Obrigado!

    
por user1357015 09.11.2015 / 23:21

4 respostas

29

Cada cron job é executado independentemente de quaisquer outros trabalhos que você tenha especificado. Isso significa que seu script de longa duração não impedirá que outros trabalhos sejam executados no horário especificado.

Se algum dos seus scripts ainda estiver em execução no próximo intervalo do cron planejado, outra instância simultânea do seu script será executada.

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

Dê uma olhada nas respostas da pergunta a seguir para obter detalhes sobre as formas de implementar um arquivo de bloqueio no seu script:

por 09.11.2015 / 23:47
8

Não tenho certeza do que você quer dizer com hora apropriada. O Cron irá iniciar os trabalhos no horário previsto para isso. Não verifica outros trabalhos agendados nem outras instâncias de um trabalho.

Assim, quaisquer trabalhos válidos que você definir serão iniciados no horário definido. Qualquer trabalho que execute mais do que o intervalo definido será iniciado várias vezes. É da responsabilidade de quem escreveu o trabalho para evitar que ele realmente seja executado várias vezes, se isso for necessário. Por exemplo, verificando um arquivo de bloqueio ou arquivo PID ou algo assim.

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

    
por 09.11.2015 / 23:37
6

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

Isso muitas vezes retarda o comando original ainda mais, levando a que outra instância seja executada antes que as anteriores sejam concluídas, etc. Ou pode ser indesejável por outras razões.

A maneira geral de prevenir é condicionar a execução do comando com um protetor que garanta que um comando anterior não esteja em execução. Por exemplo:

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

Verifique se o pgrep corresponde ao nome do comando quando ele é 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ê teria que corresponder também ao nome do script do python.

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

(pgrep sem a opção '-f' corresponde a nomes de script bash, embora)

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 corresponder ao próprio comando grep.

    
por 10.11.2015 / 10:24
0

Eu uso flock .

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
    
por 06.11.2017 / 20:49

Tags