Múltiplas entradas @daily crontab são processadas em ordem, serialmente?

22

Quero que dois trabalhos sejam executados em algum momento todos os dias, em série, exatamente na ordem especificada. Esse crontab fará de forma confiável o que eu quero?

@daily job1
@daily job2

Estou assumindo que eles correm um após o outro, mas eu era incapaz de encontrar a resposta através de pesquisa na Web ou de 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 as tarefas agendadas @dailyem paralelo ou em uma ordem imprevisível.

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

Cron é fornecido pelo cronpacote. O sistema operacional é o Ubuntu 10.04 LTS (servidor).

Adam Monsen
fonte
Você sabe qual cron está sendo fornecido pelo cronpacote? Quase todos os daemons cron que conheço lidam com isso em ordem e, de forma síncrona, geralmente analisam primeiro cada arquivo em ordem alfabética (embora alguns o façam pelo período de tempo entre as execuções em ordem crescente) e depois os trabalhos dentro em ordem de linha.
Chris Baixo
5
O fato de ser subespecificado geralmente significa que é deixado para a implementação e, geralmente, é melhor não depender desse comportamento. Provavelmente é mais limpo e melhor organizado colocar uma sequência de tarefas em que a sequência é importante em seu próprio script, em vez de como entradas separadas do crontab.
jw013
@ Chrishrown: Vixie Cron, eu acho. pacotes.ubuntu.com/lucid/cron
Adam Monsen
1
Eu sugiro que se você realmente deseja executá-los em ordem, execute um minuto depois.
6117 Kevin
@ jw013 e Kevin: concordaram, mas essa não é a minha pergunta.
Adam Monsen

Respostas:

26

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

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

Tudo isso deve ser sinalizado e com carga limitada; ou seja, em vez de @hourly significa "0 * * * *", deve significar "próximo à frente de cada hora, mas não até que a carga do sistema seja baixa". (…) (Vix, jan90)

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

Além disso, tornar a ordem explícita elimina o risco de um futuro administrador reordenar as linhas, pensando que isso não será importante.

Gilles 'SO- parar de ser mau'
fonte
5

http://ss64.com/osx/crontab.html (assim como outras referências) afirma que @daily é equivalente a

0 0 * * *

que diz para correr à 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 seria a primeira execução. Eu concordo com a sugestão de jw013 em seu comentário:

O fato de ser subespecificado geralmente significa que é deixado para a implementação e, geralmente, é melhor não depender desse comportamento. Provavelmente é mais limpo e melhor organizado colocar uma sequência de tarefas em que a sequência é importante em seu próprio script, em vez de entradas separadas do crontab.

Tom Barron
fonte
Isso ajuda, obrigado. Concordo que a sugestão de @ jw013 é válida, mas essa não é a pergunta que fiz. Acho que vou ter que consultar a fonte real para obter a resposta definitiva, pois isso provavelmente é, de fato, específico da implementação.
Adam Monsen
0

O @Giles comenta o uso de um único script quando é importado para executar as coisas em ordem, é apropriado.

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

Quando os horários são especificados, todos os trabalhos agendados para o minuto atual são executados. É uma boa ideia usar horários diferentes.

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

BillThor
fonte
@dailyé um pouco diferente de /etc/cron.daily. O primeiro é uma sintaxe alternativa para uso em um crontab. Também dê uma olhada run-parts. Meu sistema usa run-partspara executar programas /etc/cron.daily. De acordo com a página de run-parts(8)manual, "Os arquivos são executados na ordem de classificação lexical de seus nomes ...".
Adam Monsen