3 janvier 2013

Planifier un traitement par "crontab"

Sur les systèmes Unix les fichiers paramètres "crontab" servent à planifier des traitements réguliers (par exemple les arrêts/démarrages quotidiens ou la purge des fichiers obsolètes). Ils sont consultés et pris en charge par un processus système nommé "cron".

$  ps -ef | grep cron
    root  364580       1   0   Dec 28      -  0:05 /usr/sbin/cron 


Certains sites n'ayant pas d'outils d'ordonnancement peuvent aussi utiliser le "crontab" pour planifier les traitements fonctionnels (calcul de la paie, restitutions, interfaces ...).

Chaque utilisateur Unix peut créer sa crontab (sauf si l'administrateur en a bloqué l'usage - cf fichiers cron.allow et cron.deny de /var/adm/cron).

Syntaxe de la commande

crontab [ -e [UserName] | -l [UserName] | -r [UserName] | -v [UserName] | File ]

A noter : seul l'administrateur peut  accéder à la crontab d'un autre utilisateur.

Dans la pratique :
  • On se connecte avec le compte de l'utilisateur concerné,
  • On liste le contenu de son fichier de paramètre crontab par la commande "crontab -l",
  • On édite pour modification sa crontab par la commande "crontab -e", on fait la saisie sous "vi" et on l'enregistre par le ":wq" habituel - sinon ":q!" pour ne pas sauvegarder,
  • Le système va par défaut sauvegarder la crontab dans un fichier sous /var/spool/cron/crontabs.

Format du fichier paramètre

Le format du fichier "crontab" est indiqué ci dessous.
Vous pouvez placer en entête de votre crontab ce pense bête :


# *     *     *   *    *        command to be executed
#
# |     |     |   |    |
# |     |     |   |    +----- day of week (0 - 6, Sunday=0)
# |     |     |   +------- month (1 - 12)
# |     |     +--------- day of month (1 - 31)
# |     +----------- hour (0 - 23)
# +------------- min (0 - 59)
#

(une ligne blanche ou commençant par # est ignorée)

Ainsi,
"0          8   *       *   1-5   command" exécutera la commande à 8h00 tous les jours ouvrés ,
"0,15,30,45 *   *       *   *     command" exécutera la commande tous les quart d'heure,
"0          8   1,10-12 *   *     command" exécutera la commande à 8h00 les 1, 10, 11 et 12 du mois.

Les champs "day of month" et "day of week" - s'ils sont tous deux alimentés - sont cumulatifs,

A noter : une commande est exécutée par "cron"
  • A partir d'un sous shell ouvert dans le répertoire $HOME du compte,
  • Le .profile doit être exécuté si vous souhaitez bénéficier des variables d'environnement (sinon seules quelques variables dont  HOME, LOGNAME, SHELL (=/usr/bin/sh), et PATH sont disponibles).
  • Certains caractères spéciaux doivent être "déspécialisés" pour être correctement interprétés. Ainsi pour suffixer un log par une date on utilisera : `date +\%Y-\%m-\%d-\%H.\%M.\%S`

Exemple

Soumission d'une NOY par le script spécifique sub_noy à 5h20 tous les lundi matin :

20 5 * * 1 ( . ${HOME}/.profile; sub_noy -p YIYZE -f ${FILE}/PSBBCG.ZE ) >> /hradev/hraccess/txt/log/cron.log 2>&1

Sauvegarder le crontab

Vincent nous a un jour édité le crontab en utilisant l'option "-r" ("read" s'est-il dit). L'option en question a détruit la crontab ("-r" signifie "remove" !) ... Pour prévenir de ces incidents, je vous engage a automatiser une copie de sauvegarde du crontab.

Exemple :
# Sauvegarde hebdomadaire du crontab à 5h00 chaque dimanche
00 05 *  *  0  ( . ${HOME}/.profile; crontab -l >> ${SIGACS}/param/crontab.SauvegardeHebdomadaire 2>&1) >> /hradev/hraccess/txt/log/cron.log 2>&1
 

# Sauvegarde mensuelle du crontab à 5h00 chaque 1er du mois
00 05 1  *  *  ( . ${HOME}/.profile; crontab -l >> ${SIGACS}/param/crontab.SauvegardeMensuelle    2>&1) >> /hradev/hraccess/txt/log/cron.log 2>&1



Aucun commentaire:

Enregistrer un commentaire