mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HowtoCron.md 6.7 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. ---
  2. categories: sysadmin web
  3. title: Howto Cron
  4. ...
  5. * man 5 crontab : <https://manpages.debian.org/jessie/cron/crontab.5.en.html>
  6. Le service **cron** (diminutif de *crontab*, pour **c**h**ron**o **tab**le) est le planificateur de tâches standard sur les systèmes UNIX/Linux. Il permet le déclenchement de commandes à des dates récurrentes (à la minute près).
  7. ## Installation
  8. En général le paquet **cron** est installé et le service tourne déjà :
  9. ~~~
  10. # systemctl status cron
  11. ● cron.service - Regular background program processing daemon
  12. Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
  13. Docs: man:cron(8)
  14. Main PID: 492 (cron)
  15. CGroup: /system.slice/cron.service
  16. └─492 /usr/sbin/cron -f
  17. ~~~
  18. ## Configuration
  19. La configuration se trouve dans le fichier `/etc/crontab` :
  20. ~~~
  21. SHELL=/bin/sh
  22. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  23. 17 * * * * root cd / && run-parts --report /etc/cron.hourly
  24. 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
  25. 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
  26. 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
  27. ~~~
  28. On trouve notamment des dates fixées pour les actions définies dans les répertoires `/etc/cron.{hourly,daily,weekly,monthly}/` : nous conseillons de modifier ces horaires fixes, pour éviter des déclenchements simultanés sur plusieurs serveurs.
  29. On peut également modifier certaines options via le fichier `/etc/default/cron`, notamment la journalisation : par défaut `-L 5` enregistre le démarrage de chaque cron et les éventuelles erreurs, on peut passer à `-L 15` pour avoir un maximum d'informations notamment la date de fin de chaque cron.
  30. ## Utilisation
  31. ### /etc/cron.{hourly,daily,weekly,monthly}/ et /etc/cron.d/
  32. Pour lancer un script en tant que _root_ à une date fixée par le système, il suffit de le rendre exécutable et de le placer dans l'un des répertoires `/etc/cron.{hourly,daily,weekly,monthly}/` en fonction de la fréquence souhaitée.
  33. Pour une fréquence personnalisée, on peut utiliser le répertoire `/etc/cron.d/` où il faudra indiquer en plus la fréquence et l'utilisateur qui doit lancer la commande, par exemple :
  34. ~~~
  35. 30 05 * * 0 www-data /usr/local/adm/savelog-weekly
  36. ~~~
  37. Attention, en cas d'erreur de syntaxe dans un script, tous les autres scripts du même répertoire ne seront pas lancés ! Il faut donc réserver cette utilisation à des scripts bien vérifiés (c'est notamment utilisé par les packages Debian).
  38. ### crontab -e
  39. Pour ajouter un cron manuellement, on conseille d'utiliser la commande :
  40. ~~~
  41. $ crontab -e
  42. # crontab -u jdoe -e
  43. ~~~
  44. L'un des avantages de cette commande est que la syntaxe sera vérifiée en quittant l'éditeur.
  45. Pour lancer une commande à une fréquence personnalisée, la syntaxe est :
  46. ~~~
  47. minutes heures jours mois jour/semaine commande
  48. ~~~
  49. On peut utiliser `*` pour toutes les occurences (tous les jours, ou toutes les heures, etc.). On peut également utiliser des listes à virgule (`3,5,7`) ainsi des intervalles (`2-6`) ; on peut aussi avoir des intervalles réguliers (`*/15`).
  50. Exemples de crontab :
  51. ~~~
  52. 0,30,45,51 * * * * /usr/local/adm/send-data
  53. */15 * * * * /usr/local/adm/check-nis 1>/dev/null 2>&1
  54. 00 01 * * * nice -10 find /inf -name core -exec rm -f {} \;
  55. 10 03 * * 1-6 nice -10 /usr/local/adm/sauvegarde-daily
  56. 30 05 * * 0 /usr/local/adm/savelog-weekly
  57. 30 06 1 * * /usr/local/adm/savelog-monthly
  58. 00 00 1 1 * /usr/local/bin/happy-new-year
  59. @daily /usr/local/bin/minuit-check
  60. ~~~
  61. On peut utiliser les mots clés `@hourly`/`@daily`/`@weekly`/`@monthly` pour lancer à la première minute de chaque heure/jour/semaine/mois (à ne pas confondre avec les répertoires /etc/cron.{hourly,daily,weekly,monthly}/ qui sont lancés à des dates particulières).
  62. Pour [plus d'informations sur la syntaxe](https://manpages.debian.org/jessie/cron/crontab.5.en.html) :
  63. ~~~
  64. $ man 5 crontab
  65. ~~~
  66. Pour lister les crons, on peut utiliser la commande :
  67. ~~~
  68. $ crontab -l
  69. # crontab -u jdoe -l
  70. ~~~
  71. Pour supprimer tous les crons en place, on peut utiliser `crontab -r`… mais c'est assez rare qu'on l'utilise. Il faut surtout se méfier de ne pas le taper par erreur à la place de `crontab -e` !
  72. Pour plus de détails sur l'utilisation de la commande `crontab` en tant qu'utilisateur, voir [HowtoCrontab](), et pour des recommandations sur l'écriture de scripts à mettre en crontab voir [TipsDevWeb#scripts-en-crontab]().
  73. #### variables
  74. Plusieurs variables peuvent être utilisées dans une crontab :
  75. `PATH` : pour redéfinir le PATH des commandes lancés
  76. `SHELL` : par défaut c'est /bin/sh qui est utilisé, on peut vouloir utiliser /bin/bash par exemple
  77. `MAILTO` : lorsqu'une commande génère une sortie (stdout/stderr), elle est envoyée par email à l'utilisateur. On peut changer l'email destinataire avec cette variable. On pourra notamment mettre une liste à virgule pour envoyer à plusieurs adresses, ou alors `MAILTO=""` pour empêcher l'envoi d'un message.
  78. Ces variables peuvent être définies plusieurs fois, notamment `MAILTO` qui pourra précéder chaque ligne de cron :
  79. ~~~
  80. MAILTO=jdoe@example.com,alert@example.com
  81. @daily df -h
  82. MAILTO=""
  83. @hourly systemctl restart javajob
  84. MAILTO=alert@example.com
  85. @weekly /usr/local/bin/security-check
  86. ~~~
  87. #### /var/spool/cron/crontabs/
  88. Les crons positionnés avec `crontab -e` sont stockés dans le répertoire `/var/spool/cron/crontabs/`
  89. C'est notamment utile pour réaliser des sauvegardes des crons lancés sur un serveur.
  90. ## log2mail
  91. On peut ajouter la configuration suivante au logiciel log2mail pour détecter d'éventuelles erreurs de syntaxe :
  92. ~~~
  93. file = /var/log/cron.log
  94. pattern = "Error"
  95. mailto = root
  96. ~~~
  97. ## FAQ
  98. ### Peut-on écrire un cron dans /etc/crontab ?
  99. Si vous ajoutez une ligne de cron dans `/etc/crontab` elle sera exécutée en _root_ : mais nous déconseillons fortement cette utilisation car ce fichier de configuration doit rester intact autant que possible, en général il faut éviter de lancer un cron en tant que _root_ et enfin la moindre erreur de syntaxe va provoquer le non lancement de tous les autres scripts !
  100. ### Changement d'heure
  101. En France, lors d'un changement d'heure d'été ou d'hiver, on peut imaginer qu'un script lancé entre 2h et 3h du matin se lancera deux fois ou zéro fois selon les cas. Mais sous Debian, lorsque *cron* détecte un saut important dans l'heure locale, il va prévenir ce comportement en lançant les crons qu'une seule fois (passage à l'heure d'hiver) ou juste après le changement d'heure (passage à l'heure d'été). Par précaution, nous évitons tout de même de mettre des crons entre 2h et 3h du matin.