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
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:
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: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:
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.
la source
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 quela source
Cela a fonctionné pour moi:
Où 1 est le décalage des minutes. Donc, si vous voulez compenser trois minutes:
J'ai ce travail dans les paramètres de planification AWS
la source