Misfu, le site des cours Informatique/Bureautique/Mathematiques


 

Crontab et At: La planification des tâches

Généralités et description de la commande


La commande crontab permet d'indiquer des commandes qui doivent être exécutées à intervalles réguliers.


Elle lit les informations nécessaires soit dans un fichier spécifié comme paramètre soit par le canal d'entrée standard. crontab marche de pair avec le daemon cron qui est lancé lors de l'initialisation du système.


Enfin Crontab enregistre les lignes de chaque utilisateur dans un fichier portant son nom dans le répertoire /var/spool/cron.


Syntaxe


crontab [Fichier]

crontab -e (pour l'édition à l'aide de l'éditeur configuré sur la station)

crontab -l (l'utilisateur visualise les ordres qu'il a confiés à crontab

crontab -r (les ordres de l'utilisateur sont supprimés)


Format des entrées de crontab

L'indication des commandes à exécuter régulièrement est faite dans une liste, ligne par ligne.


Chaque ligne est composée de six champs séparés au minimum par un espace :



indicateur temps

Commentaires

Minute à laquelle survient l'événement. Valeurs possibles : 0-59, *.

Heure au format 24 heures. Valeurs possibles : 0-24, *

Numéro du jour dans le mois. Valeurs possibles : 0-31, *

Valeurs possibles : 0-12

Jour de la semaine. Valeurs : 0 (dimanche) - 6 (samedi). Les abréviations des jours anglais sont possibles : sun, mon, tue, wed, etc.

Commande à exécuter. Spécifier des chemins d'accès absolus dans les commandes. On ne peut utiliser que le Bourne shell.


Les astérisques représentent toutes les valeurs légales.


n-m représentent toutes les valeurs légales entre n et m (entiers) ; donc un intervalle.


n,m,r,x,y constitue une liste de valeurs.



Exemples :


0 1 * * * find /tmp -atime 3 -exec rm -f {} ; # Tous les jours de tous les mois à l'heure indiquée.

0 1 1 * * find /tmp -atime 3 -exec rm -f {} ;

0 1 * * mon find /tmp -atime 3 -exec rm -f {} ; # Tous les lundis

0 1 1,15 * * find /tmp -atime 3 -exec rm -f {} ; Le 1er et le 15 de tous les mois

0 1 1-15 * * find /tmp -atime 3 -exec rm -f {} ; Chaque jour du 1er au 15

0 1 /5 * * find /tmp -atime 3 -exec rm -f {} ; # tous les 5 jours


Conditions d'utilisation de la commande crontab


C'est root qui définit les permissions d'utilisation de crontab, dans le fichier /etc/cron.allow. Les utilisateurs dont le nom figure dans ce fichier ont la permission d'utiliser la commande crontab. Si ce dernier n'existe pas, alors le système scrute le fichier /etccron.deny. pour déterminer si un utilisateur donné est autorisé à utiliser la commande ou non. Si les deux fichiers existent, alors c'est le fichier cron.allow qui prévaut. Si aucun des deux fichiers n'existe, alors seul root est autorisé à soumettre un travail au processus cron. Si le fichier cron.deny est vide, tous les utilisateurs peuvent se servir de crontab.


cron.allow

cron.deny

Utilisateurs autorisés

-

-

root

existe

ignoré

Tout utilisateur dans cron.allow

-

existe

Tout utilisateur qui n'est pas dans cron.deny

vide

ignoré

root

-

vide

Tous les utilisateurs


Schéma général de programmation d'opérations récurrentes



Vérifier que le processus cron est actif


$ ps -ef | grep cron


Root doit ajouter le nom des utilisateurs autorisés dans le fichier /var/adm/cron/cron.allow


# vi /etc/cron.allow


L'utilisateur crée son propre fichier cronfile et y introduit les commandes à exécuter.


$ vi cronfile


L'utilisateur soumet le fichier cronfile pour traitement par le processus cron, à l'aide de la commande crontab.


$ crontab cronfile


Schéma de modification d'un fichier cronfile


Afficher le contenu du fichier cronfile existant (nous supposons que l'utilisateur est joe)


$ cd /home/joe

$ crontab -l > cronfile


Modifier son fichier cronfile


$ vi cronfile


Soumettre de nouveau son fichier cronfile au processus cron


$ crontab cronfile


Pour supprimer le fichier cronfile, utiliser l'option -r


$ crontab -r



Quelques Observations


En principe, cron dirige la sortie standard sur la sortie d'erreurs et envoie tout le résultat à l'utilisateur concerné sous forme d'un courrier électronique.


Pour diminuer les courriers de cron, il est conseillé souvent de rediriger la sortie standard vers /dev/null ou vers un fichier de trace comme ceci :


0 1 * * * find /tmp -atime 3 -exec rm -f {} ; >> /home/mdw/log


Ici, les sorties standard et d'erreurs sont redirigées :


0 1 * * * find /tmp -atime 3 -exec rm -f {} ; >> /home/mdw/log 2>&1


Lorsque crontab lit les informations nécessaires par le canal d'entrée standard, après la dernière commande, il faut appuyer sur la touche Entrée puis sur la combinaison de touches Ctrl-D.


Si la commande à lancer est trop longue /et/ou tient sur plusieurs ligne, écrire un script et le faire exécuter par crontab.


Crontab et les tâches du système


Dans les taches lancées par cron on peut distinguer les taches du système et les taches utilisateur.
Les tâches du système sont en général définies par le fichier /etc/crontabUn examen rapide de ce fichier fait apparaitre une suite de lignes comportant sept champs :


root@misfu.com:/etc# cat crontab

# /etc/crontab: system-wide crontab

# Unlike any other crontab you don't have to run the `crontab'

# command to install the new version when you edit this file.

# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# run-parts

# m h dom mon dow user command

#

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

# Mandriva-Security : if you remove this comment, remove the next line too.

0 4 * * * root /usr/share/msec/security.sh


Sur la Mandriva, on voit donc que par défaut certaines tâches sont automatisées. En fait le fichier crontab indique qu'il doit par exemple exécuter tous les scripts situés dans le répertoire /etc/cron.hourly, une fois par heure,et ainsi de suite avec daily (une fois par jour), weekly (une fois par semaine), etc....


Deux possibilités s'offrent donc pour automatiser nos propres tâches, soit on met dans les répertoires prédéfinis nos propres scripts, soit on édite le fichier crontab pour exécuter au moment que l'on souhaite nos tâches.


Comme on peut le constater, les cinq premiers champs sont les mêmes que pour les tâches utilisateur. Le sixième champ correspond au nom de l'utilsateur ayant planifié la tâche en question.


L'abbréviation dom correspond à Day Of Month, mon à MONth et dow à Day Of Week. La commande run-parts permet de lancer des scripts ou programmes se trouvant dans un répertoire.


Description et utilisation de la commande : at


Description

Dans sa forme première, cette commande lit un ou plusieurs appels de programmes ou commandes qui seront exécutés à un moment précis, avec des paramètres spécifiques. La lecture se fait à partir du canal d'entrée standard.


Syntaxe :


at Heure [Date] [+Incrément]


Description des paramètres et options


paramètre

Commentaires

Heure

L'indication d'heure est faite sous forme d'un nombre sur 1, 2 ou 4 chiffres (HHMM ou HH:MM). Sont reconnus aussi 'noon' (midi pile), midnight (minuit), now (maintenant)

Date

L'indication de date est faite au format américain, se compose d'un nom de mois abrégé sur 3 caractères et d'un numéro de jour séparé du mois par un espace (par ex Jul 31, mar 5, etc). On peut aussi utiliser le nom complet ou abrégé (sur 3 caractères) du jour dans la semaine en anglais (par ex. mon, tue,wed, thu, fri, sat et sun). Sont reconnus aussi today, tomorrow

Incrément

C'est un nombre avec une unité (minutes, hours, days, weeks, months ou years) ou 'next'.


Exemples (sans la commande à exécuter) :


at 1715

at noon

at now +1 day

at thu next week


Exemple complet :


$ at 3:00 pm mar 3

echo « Joyeux anniversaire » > /dev/console

CTRL-D


Conditions d'utilisation de la commande at


Deux fichiers contrôlent l'accès à la commande at :


- /etc/at.allow

- /etc/at.deny


A l'invocation de la commande, le système vérifie d'abord l'existence du fichier at.allow. S'il existe, alors les utilisateurs dont le nom figure dans le fichier ont la permission d'utiliser la commande at. S'il n'existe pas, le système recherche le fichier at.deny. Si celui-ci est présent, alors les utilisateurs dont le nom figure dans le fichier n'ont pas la permission d'utiliser at. Si les deux fichiers sont présents, c'est le fichier at.allow qui prévaut. Si aucun de ces deux fichiers n'est présent, seul l'utilisateur root (en général l'administrateur du système) peut lancer la commande at.


L'existence d'un fichier at.deny vide donne à tous les utilisateurs la permission d'utiliser la commande at. De même, l'existence d'un fichier at.allow vide interdit à tous les utilisateurs l'utilisation de la commande at.
Le tableau ci-dessous résume ce mécanisme de la possibilité d'utilisation de la commande at.

at.allow

at.deny

Utilisateurs autorisés

-

-

root

existe

ignoré

Tout utilisateur dans at.allow

-

existe

Tout utilisateur qui n'est pas dans at.deny

vide

ignoré

root

-

vide

Tous les utilisateurs


Toutes les sorties faites par les programmes à travers le canal de sortie standard ou le canal d'erreur standard sont dirigés vers la boîte aux lettres de l'utilisateur appelant.


Gestion des jobs programmés (et mis en attente) par at


Il existe deux commandes permettant de manipuler les files de travaux en attente d'exécution :


La commande atq affiche la liste des commandes en attente d'exécution sauf si l'appelant est le super-utilisateur. Dans ce dernier cas, atq affiche la liste des travaux en attente pour tous les utilisateurs (Le système codifie chaque job ou tâche dans un shell script spécifique qu'il sauvegarde dans le répertoire /var/spool/at).


La commande atrm num_job efface le job en attente et portant le numéro num_job. Pour avoir les numéros des job, il faut exécuter atq. Le premier champ des lignes affichée par cette commande correspond au numéro du job concerné par la ligne.

Note : La Mandriva intègre un outil graphique de configuration de cron et de at. Il porte le nom de drakcronat.


Vous pouvez rajouter çà en bas de votre fichier (sur crontab -e)
#- - - - -
#| | | | |
#| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
#| | | ------- Month (1 - 12)
#| | --------- Day of month (1 - 31)
#| ----------- Hour (0 - 23)
#------------- Minute (0 - 59)

# Tous les jours à 23h30:
# 30 23 * * * df >>/tmp/log_df.txt
# Toutes les heures, passées de 5 minutes :
# 5 * * * * df >>/tmp/log_df.txt
# Tous les premiers du mois à 23h30:
# 30 23 1 * * df >>/tmp/log_df.txt