web-dev-qa-db-fra.com

Comment faire en sorte que cron exécute quelque chose à chaque "N" ème minute, où n% 5 == 1?

Je sais que je peux faire exécuter quelque chose toutes les cinq minutes avec une ligne comme celle-ci:

 */5 * * * * /my/script

Que se passe-t-il si je ne veux pas que ça fonctionne à midi, 12h05, 12h10, mais plutôt à 12h01, 12h06, 12h11, etc.? Je suppose que je peux faire ceci:

 1,6,11,16,21,26,31,36,41,46,51,56 * * * * /my/script

... mais c'est moche. Y a-t-il une manière plus élégante de le faire?

43
mike
1-56/5 * * * * /my/script

Cela devrait fonctionner sur vixiecron, je ne suis pas sûr des autres implémentations.

76
David Z

Utilisez votre premier horaire:

*/5 * * * * /my/script

Et ajoutez ceci au début de votre script:

sleep 60

(Oui, c'est une blague)

17
Sean Bright

C'est un sujet assez ancien, mais comme beaucoup de temps s'est écoulé, il existe maintenant quelques autres options. L'une d'elles consiste à ne pas utiliser cron du tout, ni à utiliser les timers systemd. Leur utilisation vous donne une granularité plus élevée que quelques secondes et de nombreuses autres options.

Plus d'informations sont disponibles ici https://wiki.archlinux.org/index.php/Systemd/Timers

par exemple pour exécuter une commande adhoc

# systemd-run --on-calendar="*:1/5" /bin/touch /tmp/foo2
Running timer as unit run-r31335c4878f24f90b02c8ebed319ca60.timer.
Will run service as unit run-r31335c4878f24f90b02c8ebed319ca60.service.

# systemctl status run-r31335c4878f24f90b02c8ebed319ca60.timer
● run-r31335c4878f24f90b02c8ebed319ca60.timer - /bin/touch /tmp/foo2
   Loaded: loaded
Transient: yes
  Drop-In: /run/systemd/system/run-r31335c4878f24f90b02c8ebed319ca60.timer.d
           └─50-Description.conf, 50-OnCalendar.conf, 50-RemainAfterElapse.conf
   Active: active (waiting) since Wed 2017-10-25 09:05:13 UTC; 40s ago

# ls -l  /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:06 /tmp/foo2

# sleep 300; ls -l  /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:11 /tmp/foo2

# date; ls -l /tmp/foo2
Wed Oct 25 09:21:42 UTC 2017
-rw-r--r-- 1 root root 0 Oct 25 09:21 /tmp/foo2

edit: ce type de timers ne persistera pas après le redémarrage, si vous voulez qu'ils s'assurent de générer le bon fichier de service, avec la ligne oncalendar appropriée

0
krad