tâches cron avec le même temps d'exécution

8

Supposons que plusieurs tâches cron soient configurées pour s'exécuter en même temps: s'exécutent-elles en parallèle ou juste l'une après l'autre?

(Mon cas est Debian Squeeze avec des cronjobs placés dans /etc/cron.d/mycronjobs).

Gabriele
la source

Réponses:

7

Pour être complet, les travaux dans par exemple /etc/cron.{hourly,daily,weekly,monthly} sont exécutés séquentiellement. Le script run-parts boucle sur tous les fichiers de ce répertoire.

02 4 * * * root run-parts /etc/cron.daily

Vous pouvez donc l'utiliser en combinaison avec une convention de dénomination (similaire à la numérotation dans /etc/init.d/rc*.dpar exemple) pour vous assurer que les travaux s'exécutent séquentiellement.

Bram
la source
Que faire si j'ai plusieurs tâches cron dans le même fichier, configurées pour s'exécuter en même temps?
Gabriele
Je ne sais pas ce que vous entendez par "dans le même fichier". Mais si vous voulez dire que vous avez plusieurs lignes avec la même spécification d'heure (comme celle que 0 * * * *vous avez publiée plus tôt), comme d'autres l'ont publié, il n'y a aucune garantie sur l'ordre dans lequel elles s'exécuteront. Elles peuvent s'exécuter en parallèle sur un système multicœur, AFAIK l'ordre dans lequel ils s'exécutent peut même être différent chaque jour. La convention de dénomination que j'ai mentionnée en combinaison avec un run-parts ou l'utilisation d'un script maître qui appelle les scripts de sauvegarde réels est le seul moyen de s'assurer que les scripts sont exécutés dans un ordre particulier.
Bram
Ok alors, comme je dois être sûr que mes scripts s'exécuteront l'un après l'autre, je pense que je vais opter pour un "script maître" déclenché par un travail cron, et appeler tous les scripts à partir du script principal.
Gabriele
5

Les tâches répertoriées dans cron s'exécuteront en parallèle, comme le font habituellement les processus. Il n'y a aucun moyen de savoir qui commencera en premier et aucun moyen de s'assurer que la tâche A est terminée avant le début de la tâche B.

Sirch
la source
1
Vous pouvez vous assurer que la tâche A est terminée avant le début de la tâche B en les répertoriant sur la même ligne et en les séparant par un point-virgule.
Nicholas
Cela ne signifie pas que la tâche A s'est terminée avec succès. Vous pourriez peut-être utiliser un &&, mais quelque chose comme cela devrait être exécuté par un script appelé.
Sirch
Vous pouvez utiliser tous les opérandes pris en charge par le shell bash. Utilisation de &&, || ou; dans cron est une pratique courante dans mon expérience.
Nicholas
2

Cron est un démon (service) qui s'exécute en continu; cependant, il lit crontabs une fois par minute.

La séquence exacte dans laquelle les travaux sont exécutés dépendra de la mise en œuvre de la crond de vos systèmes.

Les fichiers lâches que certaines distributions placent dans /etc/cron.d/ sont analysés pour leurs paramètres de minuterie cron, car ces fichiers suivent la syntaxe crontab (5) normale.

L'ordre dans lequel les tâches individuelles sont exécutées dépend évidemment du calendrier que vous leur avez défini.

adaptr
la source
Que se passe-t-il si le calendrier est défini comme ceci: ---- 0 * * * * root sh / var / opt / backup_scripts / backup1 - 0 * * * * root sh / var / opt / backup_scripts / backup2 ---- Vont-ils exécuter séquentiellement, c'est-à-dire backup1 et, une fois terminé, backup2?
Gabriele
La séquence exacte dans laquelle les travaux sont exécutés dépendra de la mise en œuvre de la crond de vos systèmes. homme cron pour plus de détails.
adaptr
man cron ne dit rien à ce sujet (au moins dans Debian).
Gabriele
2

Ils fonctionneront en parallèle. Vous pouvez utiliser les méthodes suivantes pour exécuter les processus de manière séquentielle.

# Use a semicolon to run command2 after command1 has completed
02 4 * * * /path/to/command1 ; /path/to/command2

# Use two ampersands to run command2 after command1 has completed successfully.
02 4 * * * /path/to/command1 && /path/to/command2

# Use two vertical rules to run command2 after command1 has completed unsuccessfully.
02 4 * * * /path/to/command1 || /path/to/command2
Nicolas
la source