Les entrées multiples de @daily crontab sont-elles traitées dans l'ordre, en série?

22

Je veux que deux tâches s'exécutent chaque jour, en série, exactement dans l'ordre que je spécifie. Ce crontab fera-t-il de manière fiable ce que je veux?

@daily job1
@daily job2

Je suppose qu'ils courent un après l'autre, mais je ne pouvais pas trouver la réponse en effectuant une recherche sur le Web ou de l' une de ces pages de manuel: cron(1), crontab(1), crontab(5).

Le crontab ci-dessus ne fera évidemment pas ce que je veux si cron exécute les choses planifiées avec @dailyen parallèle ou dans un ordre imprévisible.

Je sais que je peux simplement créer un script shell pour les lancer dans l'ordre, je suis juste curieux de savoir comment cron est censé fonctionner (et je suis trop paresseux pour collecter des données de test ou lire le code source).

Cron est fourni par le cronpaquet. Le système d'exploitation est Ubuntu 10.04 LTS (serveur).

Adam Monsen
la source
Savez-vous par hasard quel cron est fourni par le cronpackage? Presque tous les démons cron que je connais traiteront cela dans l'ordre et de manière synchrone, généralement en analysant d'abord chaque fichier par ordre alphabétique (bien que certains le fassent en fonction du temps entre les exécutions dans l'ordre croissant), puis les travaux à l'intérieur dans l'ordre des lignes.
Chris Down
5
Le fait qu'il soit sous-spécifié signifie généralement qu'il est laissé à l'implémentation, et il est généralement préférable de ne pas dépendre d'un tel comportement. Il est probablement plus propre et mieux organisé de placer une séquence de tâches où la séquence est importante dans son propre script plutôt que comme entrées crontab distinctes.
jw013
@ChrisDown: Vixie Cron, je pense. packages.ubuntu.com/lucid/cron
Adam Monsen
1
Je suggère que si vous voulez vraiment les exécuter dans l'ordre, faites-en exécuter une une minute plus tard.
Kevin
@ jw013 et Kevin: d'accord, mais ce n'est pas ma question.
Adam Monsen

Réponses:

26

Après un rapide coup d'œil à la source (dans Debian Squeeze, qui je pense est la même version), cela ressemble à des entrées dans un fichier donné et avec les mêmes heures sont exécutées dans l'ordre. À cet effet, @dailyet 0 0 * * *sont identiques (en fait @dailyest identique à 0 0 * * *dans ce cron).

Je ne m'appuierais pas là-dessus à tous les niveaux. Il est possible qu'un jour quelqu'un décide que cron doit exécuter des tâches en parallèle, pour profiter de ces processeurs 32 cœurs qui ont 31 cœurs en veille. Cela pourrait être fait lors de la mise en œuvre de cet élément de tâche âgé de 20 ans rencontré dans la source cron:

Tous ces éléments doivent être signalés et limités en charge; c'est-à-dire qu'au lieu de @hourly signifiant "0 * * * *" cela devrait signifier "près du début de chaque heure mais pas jusqu'à ce que la charge du système soit faible". (…) (Vix, jan90)

C'est très facile d'écrire @daily job1; job2ici. S'il est important que les travaux s'exécutent dans l'ordre, faites-en une conséquence directe de ce que vous écrivez.

De plus, rendre la commande explicite élimine le risque qu'un futur administrateur réorganise les lignes en pensant que cela n'a pas d'importance.

Gilles 'SO- arrête d'être méchant'
la source
5

http://ss64.com/osx/crontab.html (ainsi que d'autres références) indique que @daily est équivalent à

0 0 * * *

qui dit de courir à minuit. Je m'attendrais à ce que deux lignes de ce type soient lancées aussi près de minuit que possible, sans aucune garantie quant à la première. Je suis d'accord avec la suggestion de jw013 dans son commentaire:

Le fait qu'il soit sous-spécifié signifie généralement qu'il est laissé à l'implémentation, et il est généralement préférable de ne pas dépendre d'un tel comportement. Il est probablement plus propre et mieux organisé de placer une séquence de tâches où la séquence compte dans son propre script plutôt que comme entrées crontab distinctes.

Tom Barron
la source
Cela aide, merci. Je suis d'accord que la suggestion de @ jw013 est valide, mais ce n'est pas la question que j'ai posée. Je suppose que je vais devoir consulter la source réelle pour la réponse définitive, car cela est probablement, en effet, spécifique à la mise en œuvre.
Adam Monsen
0

@Giles commente l'utilisation d'un seul script lors de son importation pour exécuter les choses dans l'ordre est approprié.

cron.dailyles fichiers ne spécifient pas les temps d'exécution. D'après mon expérience, ils fonctionnent en série. Cela a du sens, car de nombreux travaux d'arrière-plan peuvent s'exécuter sur un ordinateur portable ou un autre système.

Lorsque des heures sont spécifiées, tous les travaux planifiés pour la minute en cours sont exécutés. C'est une bonne idée d'utiliser des moments différents.

Si vous avez des travaux qui s'excluent mutuellement, il est courant d'utiliser un fichier de verrouillage pour déterminer si l'autre travail est en cours d'exécution.

BillThor
la source
@dailyest légèrement différent de /etc/cron.daily. La première est une syntaxe alternative à utiliser dans une crontab. Jetez également un œil à run-parts. Mon système utilise run-partspour exécuter des programmes /etc/cron.daily. Selon la run-parts(8)page de manuel, "Les fichiers sont exécutés dans l'ordre de tri lexical de leurs noms ...".
Adam Monsen