Crond a décalé le programme de cinq minutes

22

Est-il possible de compenser un jeu de scripts cron pour qu'il s'exécute toutes les 5 minutes?

J'ai deux scripts, le script 1 collecte des données d'une base de données et les insère dans une autre, le script 2 extrait ces données et beaucoup d'autres données et en crée de jolis rapports. Les deux scripts doivent s'exécuter toutes les 5 minutes. Je veux décaler le script 2 d'une minute pour qu'il puisse créer un rapport à partir des nouvelles données. EG Je veux que le script un s'exécute à :00, :05, :10, :15 [...]et que le script deux s'exécute à :01, :06, :11, :16 [...]toutes les heures. Les scripts ne dépendent pas les uns des autres et le script 2 doit s'exécuter, que le script 1 ait réussi ou non. Mais il serait utile que les rapports contiennent les dernières données. Est-ce possible avec cron?

Poster;
J'ai pensé à utiliser les deux commandes dans un script shell pour qu'elles s'exécutent immédiatement l'une après l'autre, mais cela ne fonctionnerait pas, parfois le script 1 peut se bloquer en attendant les API externes, etc., il pourrait donc prendre jusqu'à 15 minutes pour s'exécuter, mais le script 2 doit s'exécuter toutes les 5 minutes, donc le faire de cette façon arrêterait / retarderait l'exécution du script 2. Si je pouvais le définir dans Cron, cela signifierait que le script 2 s'exécuterait indépendamment de ce que le script 1 faisait

Tache
la source

Réponses:

14

Vous pouvez exécuter des scripts quand vous le souhaitez cron. Si vous souhaitez exécuter le script 1 toutes les 5 minutes, vous pouvez commencer comme ceci:

*/5 * * * * /path/to/script1

Mais ce n'est vraiment qu'un raccourci pour:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Si vous souhaitez exécuter le script 2 une minute après le script 1, vous pouvez le faire:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Vous pouvez également faire ceci:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Et puis au début du script 2, dormez une minute:

sleep 60
larsks
la source
4
Mettre le sommeil dans le script lui-même est un hack laid qui rend l'exécution du script à la main douloureuse. Il existe un moyen moins laid de pirater cela en faisant de la partie sommeil de l'entrée crontab, mais une manière encore plus élégante consiste à simplement compenser les travaux en utilisant la notation crontab correcte, que votre réponse n'aborde pas.
Caleb
39

Le champ de saisie des minutes pour crontab accepte un opérateur "incréments de" qui est un peu déroutant car il semble que ce devrait être un opérateur mathématique "diviser par" mais ne l'est pas. Vous le verrez le plus souvent utilisé quelque chose comme ce qui suit. Notez que cela ne trouve pas les nombres qui sont divisibles par cinq mais prend plutôt chaque cinquième élément d'un ensemble:

 */5 * * * * command

Cela indique à cron de faire correspondre chaque cinquième élément ( /5) de l'ensemble des minutes 0-59 ( *), mais vous pouvez modifier l'ensemble comme ceci:

 1-59/5 * * * * command

Cela prendrait chaque cinquième élément de l'ensemble 1-59, exécutant votre commande aux minutes 6, 11, 16, etc.

Si vous avez besoin de décalages plus fins qu'une minute, vous pouvez le pirater en utilisant la commande sleep dans le cadre de votre crontab comme ceci:

 */5 * * * * sleep 15 && command

Cela exécuterait votre travail toutes les cinq minutes, mais la commande ne démarrerait réellement que 15 secondes après la minute. Pour les travaux de courte durée où le fait d'être quelques secondes après quelque chose d'autre fait toute la différence, mais vous ne voulez pas avoir une minute de retard, c'est un hack assez simple.

Caleb
la source
1
C'est une meilleure réponse que celle acceptée. Le réglage du décalage via la plage est beaucoup plus propre que le sommeil.
ND Geek
11

Vous pouvez indiquer un décalage horaire avec le symbole +. Par exemple, pour exécuter à :01, :06, :11, :16 [...], créez une tâche telle que

*/5+1 * * * * command
Kurt
la source
7
Cela ne semble pas fonctionner dans certaines versions de cron
jhoff
1
Quelle version de cron utilisez-vous qui prend en charge cette syntaxe? Cronie ne semble pas le soutenir.
Matthew G
J'ai Cronie sur CentOS7, donc je ne vais pas essayer cette solution en premier.
AnneTheAgile
1

Cela a fonctionné pour moi:

1/5 * ? * * *

Où 1 est le décalage des minutes. Donc, si vous voulez compenser trois minutes:

3/5 * ? * * *

J'ai ce travail dans les paramètres de planification AWS

Zymotik
la source