Várias entradas crontab @daily são processadas em ordem, em série?

21

Eu quero que dois trabalhos sejam executados a cada dia, em série, exatamente na ordem que eu especificar. Este crontab fará o que eu quero com segurança?

@daily job1
@daily job2

Suponho que eles sejam executados um após o outro, mas não consegui encontrar a resposta pesquisando na Web ou em qualquer um desses manpages: cron(1) , crontab(1) , crontab(5) .

O crontab acima obviamente não fará o que eu quero se o cron executar coisas agendadas com @daily em paralelo ou em uma ordem imprevisível.

Eu sei que posso simplesmente fazer um script de shell para ativá-los em ordem, estou curioso para saber como o cron deve funcionar (e estou com preguiça de coletar dados de teste ou ler o código-fonte).

O Cron é fornecido pelo pacote cron . OS é o Ubuntu 10.04 LTS (servidor).

    
por Adam Monsen 05.12.2011 / 21:28

3 respostas

21

Após uma rápida olhada na fonte (no Debian squeeze, que eu acho que é a mesma versão), ele se parece com entradas dentro de um determinado arquivo e com os mesmos tempos são executados em ordem. Para este propósito, @daily e 0 0 * * * são idênticos (na verdade @daily é idêntico a 0 0 * * * neste cron).

Eu não confiaria nisso de maneira geral. É possível que um dia alguém decida que o cron deve executar tarefas paralelamente, para aproveitar essas CPUs de 32 núcleos que possuem 31 núcleos funcionando inativos. Isso pode ser feito ao implementar este item todo de 20 anos encontrado na fonte do cron:

All of these should be flagged and load-limited; i.e., instead of @hourly meaning "0 * * * *" it should mean "close to the front of every hour but not 'til the system load is low". (…) (vix, jan90)

É muito fácil escrever @daily job1; job2 aqui. Se é importante que os trabalhos sejam executados em ordem, faça disso uma consequência direta do que você escreve.

Além disso, tornar o pedido explícito elimina o risco de um futuro administrador reordenar as linhas, achando que isso não importará.

    
por 06.12.2011 / 01:46
4

link (assim como outras referências) diz que @daily é equivalente a

0 0 * * *

que diz para ser executado à meia-noite. Eu esperaria que duas linhas desse tipo fossem lançadas o mais próximo possível da meia-noite, sem garantia de qual delas seria executada primeiro. Eu concordo com a sugestão de jw013 em seu comentário:

The fact that it is under-specified usually means it is left up to the implementation, and it's usually best not to depend on such behavior. It's probably cleaner and better organized to put a sequence of jobs where the sequence matters in its own script instead of as separate crontab entries.

    
por 06.12.2011 / 00:55
0

@Giles comentário sobre o uso de um único script quando é importante executar as coisas em ordem é apropriado.

cron.daily files não especificam os tempos de execução. Foi minha experiência que eles correm em série. Isso faz sentido como muitos trabalhos em segundo plano que podem ser executados em um laptop ou outro sistema

Quando as horas são especificadas, todas as tarefas agendadas para o minuto atual são executadas. É uma boa ideia usar tempos diferentes.

Se você tiver trabalhos que sejam mutuamente exclusivos, é comum usar um arquivo de bloqueio para determinar se o outro trabalho está em execução.

    
por 06.12.2011 / 03:01