Cron job icon Dans mon travail je rencontre souvent des cas d’écoles dans la gestion des crontabs et autres batchs. Il y a quelque temps j’ai écrit une documentation des bonnes pratiques afin d’éclaircir ce qu’il convient de faire pour tout le monde. N’ayant jamais croisé un tel guide je le reproduit ici aujourd’hui : Pour écrire une bonne crontab, il vous faut :

  • un bon script
  • de bonnes habitudes/pratiques

Un bon script

Un script propre est un script :

  • qui écrit ses messages d’informations (suivi du déroulement) sur la sortie standard (STDOUT)
  • qui lit ses données depuis :
    • l’entrée standard (STDIN)
    • un fichier de configuration
    • une base de données
    • les arguments de la ligne de commande
  • MAIS SURTOUT qui écrit ses messages d’erreurs sur la sortie dédiée (STDERR)

Les entrées/sorties doivent être si possible différentiables. En effet STOUT et STDERR sont en général fusionnés dans le même affichage : votre terminal (nous verrons plus bas que ce n’est pas obligatoire) ex:``` shell>monScript.php –verbose

  • doing step1
  • doing step 2 [debug] i downloaded 867 elements from rapidshare.com [WARN] can’t continue with next server megaupload.com, reason : DNS faillure [ERROR] 1 server out of 2 failled
  • exiting

Redirection de canaux
---------------------

### Redirection de STDOUT:

monScript.php –verbose > /dev/null Produira avec un bon script : [WARN] can’t continue with next server megaupload.com, reason : DNS faillure [ERROR] 1 server out of 2 failled


### Redirection de STDERR :

monScript.php –verbose 2> /dev/null Produira avec un bon script : - doing step1

  • doing step 2 [debug] i downloaded 867 elements from rapidshare.com
  • exiting

### Redirection des deux canaux :

monScript.php –verbose 2> /dev/null 1>&2


### Redirection de STDIN:

monScript.php –verbose < mon-fichier-de-données.txt


Variables Crontab
=================

Dans un fichier de crontab on peux modifier différentes variables de l’environnement utiles à l’exécution :

*   MAIL: adresse e-mail ou sera envoyé toute sortie affichée par la crontab lancée (mettre une mailling list, pas une adresse nominative)
*   HOME: le répertoire par défaut ou va se placer le lancement de la commande
*   PATH: utile si un binaire dont vous avez besoin n'est pas dans le PATH par défaut

**NB:** attention une seule déclaration de ces variables est possible pour tout le fichier de crontab ex :```
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=gso.fr.mrs@buongiorno.com
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# \* \* \* \* \* user-name command to be executed
\*/10 \* \* \* 1,2,3,4,5 root /usr/local/bin/mon-job.sh > /dev/null

Conclusion

Passez aux BONNES pratiques !!! On comprend donc que la politique par défaut est de :

  1. Définir une valeur à la variable MAIL
  2. Rediriger STDOUT vers /dev/null (le trou noir, pas d’affichage)
  3. Laisser les messages d’erreur s’afficher pour recevoir un mail en cas d’erreur

Pour plus d’infos https://linux.die.net/man/5/crontab