Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

Crontab et cron Linux : utilisations et exemples

La crontab (table cron) est utilisée pour automatiser tous les types de tâches sur les systèmes Linux.
Il s’agit d’une compétence particulièrement importante à acquérir pour les administrateurs système en herbe. La prise en main de la crontab peut s’avérer difficile pour les débutants. La syntaxe est différente de celle de la plupart des autres commandes.

C’est pourquoi cette leçon comprendra un peu plus d’informations de base avant de vous montrer certaines de ses utilisations.
Tous les exemples et explications fonctionnent sur les différentes distributions Linux telles que Ubuntu, Debian, Fedora, Linux Mint et autres.

Cron : planifier une tâche sur Linux

Qu’est-ce que crontab

Crontab est un processus démon qui tourne en arrière-plan sur presque toutes les machines Linux et qui est utilisé pour planifier et exécuter des tâches automatisées à des intervalles de temps déterminés. Il est également souvent utilisé par les développeurs de logiciels pour exécuter des tâches fastidieuses en arrière-plan.

Il peut s’agir de n’importe quoi, y compris, mais sans s’y limiter, l’envoi de courriels par lots, la consultation de votre fil Twitter, l’exécution de sauvegardes ou simplement l’exécution d’un rappel.

Voici les trois composants du système cron dans Linux :

Elément Nom Signification
Daemon crond Prononcé “demon” ou “day-mon”. Il s’agit de processus d’arrière-plan du système Linux.
Table crontab Vous écrivez des lignes dans ce tableau lorsque vous entrez une commande crontab. Chaque astérisque “*” représente un segment de temps et une colonne correspondante dans chaque ligne.
Job Cron Job La tâche spécifique à effectuer est décrite dans une ligne, associée à l’heure à laquelle elle doit être effectuée.
Les différences entre crontab, cron et crond

Comprendre la syntaxe de crontab

Chaque tâche crontab se compose d’une ligne et est formatée comme suit :

crontab [options]

* * * * * <commande> 
OU
* * * * * <chemin/du/script>

Comme vous pouvez le voir, la syntaxe de la crontab comporte 5 astérisques qui représentent un champs dans le tableau de cron.
Voici ce que chacune de ces astérisques représente :

1er 2eme 3eme 4eme 5eme
* * * * *
ID Minute Heure Jour/Date Mois Nom du Jour
Valeur 0-59 0 -23 1-31 1-12 0-6
Les champs de crontab
NOTE : Les noms de jours 0 à 6 commencent par le dimanche.
Comprendre la syntaxe de crontab

Pour bien comprendre la syntaxe de crontab, voici une autre syntaxe que l’on pourrait utiliser :

mm hh jj MMM JJJ <commande>

Mettons cela rapidement en pratique. Si vous avez une crontab comme celle ci-dessous, quand pensez-vous que la tâche sera exécutée ?

Comment modifier le crontab d’un utilisateur Linux

Chaque utilisateur peut avoir son cron, pour cela, il vous suffit de se loguer avec votre utilisateur et de taper la commande
Pour modifier l’entrée crontab d’un utilisateur, on utilise l’option -e :

crontab -e

Comme je n’ai pas encore créé de crontab, lorsque j’utilise -e pour éditer le tableau, on me demande mon éditeur de texte préféré. Nano est suggéré comme le programme le plus facile à utiliser. Vous pouvez utiliser n’importe quel éditeur de texte en ligne de commande comme Vim ou Emacs. C’est à vous de décider.

crontab -e
pas de crontab pour malekalmorte - utilisation d'une crontab vide

Sélectionnez un éditeur.  Pour changer plus tard, exécutez 'select-editor'.
  1. /bin/nano <---- le plus simple
  2. /usr/bin/code
  3. /bin/ed

Choisissez 1-3 [1] : 1

Vous pouvez aussi forcer l’éditeur de crontab en modifiant la variable EDITOR ou VISUAL avec la commande export :

export EDITOR=vi

Exemples de crontab pour planifier l’exécution d’une tâche

Exécuter une commande à une date précise

Par exemple, la tâche crontab ci-dessous s’exécutera tous les soirs à 3h20 exactement :

20 3 * * * /root/backup.sh

Maintenant, voici plusieurs exemples afin de bien comprendra la syntaxe cron :

01 * * * * root echo "cette commande est exécutée toutes les heures passées d'une minute"
17 8 * * * root echo "Cette commande est exécutée tous les jours à 08h17"
17 20 * * * root echo "Cette commande est exécutée tous les jours à 20h17"
00 4 * * 0 root echo "Cette commande est exécutée tous les dimanches à 4h00"
42 4 1 * * root echo "Cette commande est exécutée tous les 1er du mois à 4h42"
01 * 19 07 * root echo "Cette commande est exécutée toutes les heures passées d'une minute tous les 19 Juillet"

Mais vous pouvez aussi combiner deux cron pour, par exemple :
Pour lancer une commande tous les lundi 16 du mois à 12h00 vous pouvez spécifiez :

* 12 16 * Mon root commande
* 12 16 * * root commande
* 12 * * Mon root commande

Utiliser les valeurs multiples

Chaque période peut également comprendre plusieurs éléments. Vous pouvez spécifier les valeurs exactes en les séparant par une virgule,

Vous pouvez aussi lister des champs de la forme 1,2,3 ce qui signifie 1 et 2 et 3.
Ici, une syntaxe équivalente est 1-3.
Voici un autre exemple cron qui démarre le script backup.sh à 11h59 le lundi, mardi, mercredi, jeudi et vendredi.

59 11 * * 1,2,3,4,5 root commande
59 11 * * 1-5 root commande

Lancer une commande/script à intervalle régulier

Une valeur comme */2 dans les jours signifie que la commande sera lancée toutes les deux jours.
et */5 dans les heures signifie que la commande sera lancée toutes les 5 heures.
Exemples avec les équivalents :

* 12 10-16/2 * * root commande
* 12 10,12,14,16 * * root commande
*/15 9-17 * * * root commande

Ainsi les listes peuvent être combinées les unes avec les autres.
Cela lance la commande cmd tous les lundi entre le 1er et le 15 et entre le 20 et 25 du mois (inclus) et le 17 de tous les mois.

* 12 1-15,17,20-25 * * root commande
* 12 10-16/2 * * root commande
* 12 10,12,14,16 * * root commande

L’utilisation des jours n’est pas case sensitive, vous devez spécifiez les 3 premières lettres, ex: Mon, sun or Mar, jul.

Comment rediriger la sortie cron

Comme nous l’avons vu les sorties cron vont par mail à l’utilisateur spécifié dans la variable MAILTO mais vous pouvez aussi supprimer ou rediriger les sorties.

Par exemple avec la syntaxe suivante, vous pouvez renvoyer un mail à l’utilisateur désiré

cmd | mail -s "Sujet du mail" <utilisateur>

Vous pouvez rediriger la sortie (par exemple vers /dev/null si vous n’en voulez vraiment pas ) ou dans un fichier de log en utilisant la syntaxe suivante :

cmd >> log.file

Ceci redirige la sortie standard et non les erreurs, pour rediriger les erreurs, vous devez utiliser la syntaxe suivante :

cmd >> logfile 2>&1

Note : en spécifiant deux > cela recréé le fichier logfile à chaque exécution de la commande.
Si vous spécifiez un seul >> le fichier  sera pas écrasé à chaque exécution vous garderez donc les logs depuis la première exécution du fichier.

Vous pouvez aussi envoyer le fichier de log par mail en créant une nouvelle entrée cron, avec la syntaxe suivante :

mail -s "Fichier de Log" <log.file

Garder les tâches crontab silencieuses

Selon les cas, vous voudrez peut-être éliminer toutes les sorties des tâches crontab afin qu’elles ne se retrouvent pas dans le dossier de courrier électronique de votre système. Vous pouvez le faire en ajoutant > /dev/null 2>&1 à n’importe quelle tâche crontab.

Par exemple :

0 6 15 * * /chemin/vers/backup.sh > /dev/null 2>&1

Comment exécuter un script automatiquement avec crontab

crontab vous permet d’exécuter n’importe quoi, une commande, un script.
Il y a tout de même quelques règles à respecter :

Par exemple pour exécuter un script de sauvegarde :

0 3 * * * ~/scripts/backup_script.sh

Par défaut, crontab utilise le shell /bin/sh dont la configuration se trouve dans /etc/crontab.
Si nécessaire, vous pouvez forcer le shell Linux. Par exemple pour forcer l’exécution du script en bash :

0 3 * * * bash ~/scripts/backup_script.sh

Par exemple pour exécuter un script PHP de vérification de sites :

*/5 * * * * /usr/bin/php /home/malekalmorte/script/check_sites.php > /dev/null 2>&1

Comment lister les tâches et supprimer du fichier Crontab

Vous pouvez dresser la liste de tous les travaux actuellement actifs dans votre fichier crontab à l’aide de la commande :

crontab -l

Vous pouvez également supprimer toutes les tâches de la crontab et vider le contenu de votre fichier crontab à l’aide de la commande :

crontab -r

Enfin l’utilisateur administrateur root peut modifier ou lister le cron d’un utilisateur avec le paramètre -u :

crontab -u malekalmorte -l
crontab -u malekalmorte -e

Le système d’exploitation stocke le cron utilisateur dans /var/spool/cron/crontabs/.
On trouve un dossier pour chaque utilisateur Linux.

Les options crontab

L’entrée crontab peut aussi prendre des options qui se placent en début.
Voici un exemple avec des options :

#commentaires

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# m h dom mon dow user  command
17 *    * * *   root    run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly

Les explications :

  • SHELL est le shell dans lequel sera executé cron. Si ce dernier n’est pas spécifié, l’entrée de l’utilisateur sera prise par défaut dans le fichier /etc/passwd
  • PATH contient les répertoires dans où les programmes seront recherchés. Si par exemple vous avez un programme ‘foo’ dans le répertoire /usr/cog/bin/ si vous ne voulez pas à chaque fois devoir taper /usr/cog/bin/foo pour lancer le programme, vous devez ajouter le chemin /usr/cog/bin dans votre PATH
  • MAILTO si une commande est lancée avec une sortie, un mail sera envoyé à cet utilisateur. Si aucun MAILTO n’est pas spécifiée, la sortie sera envoyée par mail au propriétaire de la commande qui a généré la sortie
  • HOME est le répertoire home de cron. Si aucun n’est spécifiée, ce sera l’entrée de /etc/passwd qui sera prise

L’article Crontab et cron Linux : utilisations et exemples est apparu en premier sur malekal.com.

Enregistrer un commentaire

0 Commentaires