Cron est un outil disponible sous Linux permettant la mise en place de tâches planifiées afin d’automatiser des traitement ou actions.

Introduction

Chaque utilisateur d’un système Linux dispose d’une crontab permettant la gestion de tâches planifiées.
La commandes suivante affiche le contenu de la crontab :

### Crontab vide
crontab -l
no crontab for user

### Crontab avec une tâche
crontab -l
00 * 01 * * root /usr/bin/apt-get update

Il est aussi possible d’afficher la crontab d’un autre utilisateur si on en dispose du droit.

crontab -u user -l

Voire même pour tous les utilisateurs :

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

Il est finalement possible de consulter et éditer la contab directement :

vim /etc/crontab
00 * 01 * * root /usr/bin/apt-get update

Configuration

La crontab s’édite à partir de la commande :

crontab -e

À partir de la vue de la crontab, nous pouvons configurer des tâches à planifier et le cycle de répétition de chacune.
Chaque ligne du fichier doit suivre le formatage suivant séparant chaque élément par un espace au minimum :

m h dom mon dow user command

Minutes, valeur entre 0 et 59.

Heure, valeur entre 0 et 23.

Jour du mois (day of month), valeur entre 1 et 31.

Mois, valeur entre 1 et 12.

Jour de la semaine (day of week), valeur entre 1 et 7.

Login de l’utilisateur à qui s’applique la cron (optionnel).

Commande de la tâche cron à exécuter.

Une fois la ou les tâches rédigées, on quitte et sauvegarde la crontab (ECHAP puis :wq) comme dans un fichier ouvert avec l’éditeur VIM.
Un message de prise en compte des modifications est retourné :

crontab -e
crontab: installing new crontab

Il peut arriver que cron soit planté et dans ce cas, un redémarrage sera nécessaire :

sudo service cron restart

Les différents compteurs peuvent être optimisés avec les caractères /, , (virgule) et .
Le numéro du mois mon peut être remplacé par jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov et/ou dec.
Le numéro du jour de la semaine dow peut être remplacé par mon, tue, wed, thu, fri, sat et/ou sun.

### Cron exécuté toutes les 5 minutes à 10H et 20H du lundi au vendredi
*/5 10,20 * 1-5 * commande

Diviser une période.

Lister des périodes.

Étendre une période.

Il est également possible de remplacer les * * * * * par un raccourci prédéfini : @reboot, @yearly
@annually, @monthly, @weekly, @daily, @midnight, @hourly

Toutes les heures (0 * * * *).

Tous les jours (0 0 * * *).

À chaque démarrage du système.


Exemples

Afin de vous familiariser avec les cinq éléments constituants vos tâches cron, voici quelques exemples concrets d’utilisation :

### Chaque 9 mars
0 0 9 3 * commande
### Chaque 9 mars ET chaque mardi
0 0 9 3 2 commande
### Chaque minutes du 3 avril de 15H00 à 15h59
* 15 3 4 * commande
### Tous les 12 du mois à 2H et 14H
0 2,14 12 * * commande
### Tous les 2 mois, le 1er de ce mois à midi et minuit.
0 0,12 1 */2 * commande
### Toutes les 5 minutes pendant la première demie-heure
0-30/5 * * * * commande
### Toutes 30 minutes
*/30 * * * * commande
### Toutes 30 secondes
* * * * * sleep 30 && commande

Résumé

Afin d’avoir toujours ces informations sous la main, vous pouvez les conserver dans un fichier :

# @reboot    : run once, at startup.
# @yearly    : run once a year, “0 0 1 1 *”.
# @annually  : same as @yearly
# @monthly   : run once a month, “0 0 1 * *”.
# @weekly    : run once a week, “0 0 * * 0”.
# @daily     : run once a day, “0 0 * * *”.
# @midnight  : (same as @daily)
# @hourly    : run once an hour, “0 * * * *”.

# 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

Générateur

Afin de créer des tâches cron simple plus rapidement, vous pouvez utiliser le générateur suivant :