{{tag>système administration}}
----
====== Programmer des tâches avec CRON ======
===== Qu'est-ce que Cron ? =====
**Cron** est un //daemon// utilisé pour programmer des tâches devant être exécutées à un moment précis. Chaque utilisateur a un fichier **crontab**, lui permettant d'indiquer les actions et à quelles périodes, elles devront être exécutées. Il y a également une **crontab** pour le système, permettant les tâches techniques, pour la mise à jour des différents programmes ou autres besoins périodiques. De plus, il existe [[gnome-schedule]] sous Gnome ou **[[apt://gcrontab|gCrontab]]**, un éditeur GTK (paquet disponible via [[:Synaptic]] dans les dépôts Universe) qui permet de s'affranchir facilement des différentes commandes décrites ci-dessous.
===== Comment fonctionne Cron ? =====
Il est conseillé de ne pas modifier /etc/crontab directement et d'utiliser plutôt la méthode décrite dans la section suivante (crontab -e)
Pour utiliser **cron**, ajoutez simplement les entrées à votre fichier **crontab** (situé dans le répertoire /etc). Une entrée dans **crontab** donne, par exemple, l'heure, (et la date si non périodique) et la commande à lancer :
5 3 * * * nomdutilisateur /usr/bin/apt-get update
La première partie de l'entrée de **crontab** décrit quand l'action sera effectuée. Il y a cinq champs, séparés par un espace ou une tabulation, dont chacun est paramétré soit par, un nombre, une étoile (*), ou le texte approprié. Les champs sont, dans l'ordre, //minute//, //heure//, //jour du mois//, //mois// et //jour de la semaine//. Le mois et le jour de la semaine permettent l'utilisation d'une abréviation (suivant les jours et mois en anglais), telle que **jan** pour janvier (January) ou **thu** pour jeudi (Thursday).
Chaque ligne dispose de 5 champs de date et d’heure, suivis d’une commande et __enfin d’un retour à la ligne__ (« \n »).
L'exemple ci-dessus exécutera ///usr/bin/apt-get update//, chaque jour, de chaque mois à 03:05 (le **cron** fonctionne sur 24 h) avec les droits de l'utilisateur **nomdutilisateur**. Vous pouvez faire tourner **cron** toutes les 5 minutes tout au long de la journée de travail (9am-5pm) avec un message :
*/5 9-17 * * mon,tue,wed,thu,fri wall "Où en es tu ?"
ou vous rappeler un anniversaire à 9h du matin le 10 janvier chaque année :
0 9 10 jan * echo "C'est l'anniversaire de ta Maman aujourd'hui !" >>~/readme
Il existe des raccourcis intéressants :
* @reboot # se lance au reboot avec les droits utilisateurs, bien commode
* @yearly
* @annually
* @monthly
* @weekly
* @daily
* @midnight
* @hourly
Cf aussi :
man 5 crontab
Pour exécuter des applications graphiques, il faut tout d'abord être sûr que l'usager root a accès au //display// si jamais le contrôle d'accès est actif (cf. **xhost**), par exemple en exécutant (soi-même, ou en rajoutant la ligne dans un script de démarrage comme //rc.local//) :
xhost + local:root
Puis il faut préciser quel //display// utiliser lors de l'exécution de la commande à cron en ajoutant DISPLAY=//nom_du_display// au début de la commande à exécuter ; par exemple :
0 8 * * * DISPLAY=:0.0 totem "mon_fichier_son.mp3"
===== Commande pour Cron =====
Pour regarder le contenu de votre **crontab**, tapez :
crontab -l
Pour éditer le fichier de votre **crontab**, tapez :
crontab -e
Quand vous sortez de l'éditeur, le nouveau fichier **crontab** sera installé. Le fichier est stocké dans ///var/spool/cron/crontabs/// mais doit seulement être édité par l'intermédiaire de la commande **crontab**.
Note : sur xubuntu, il faut auparavant indiquer que l'utilisateur a le droit d'utiliser crontab. Pour cela il faut créer un fichier ///etc/cron.allow// et y saisir le nom des utilisateurs autorisés à utiliser crontab.
L'éditeur utilisé pour modifier la crontab peut être modifié par la commande :
sudo update-alternatives --config editor
===== Lancement graphique =====
Si vous avez besoin d'une interface graphique par exemple pour utiliser zenity, kdialog, dialog ou encore totem, vlc, ... Il vous faudra effectuer plusieurs choses :
1° ajouter un DISPLAY=:0 devant la commande dans le cron.
Exemple :
*/5 * * * * DISPLAY=:0 zenity --info --text="Toto va bien"
Il est parfois nécessaire de faire "xhost +" dans un terminal pour autoriser l'accès à X
2° Si vous utilisez un script nécessitant des caractères tels que des accents, n'oubliez pas d'ajouter un export LANG="fr_FR.UTF-8" ou LANG="fr_BE.UTF-8" au début de ce script. D'autre part il est grandement conseillé de mettre le chemin absolu vers les exécutables et fichiers.
Exemple :
#!/bin/bash
export LANG="fr_BE.UTF-8"
/usr/bin/zenity --info --text="Toto va bien.\nReviens manger à la maison\!"
===== Autres Considérations =====
Les commandes ci-dessus sont stockées dans un fichier **crontab** appartenant à votre compte d'utilisateur et exécutées avec votre niveau des permissions. Si vous voulez exécuter, régulièrement, une commande exigeant un plus haut niveau de permission (root), vous devez utiliser le fichier **crontab** root (ou racine) :
sudo crontab -e
Remarque : cette commande édite directement le fichier // /var/spool/cron/crontabs/// (avec ici root comme utilisateur).
Selon les commandes à exécuter, vous devrez changer la variable //PATH// des utilisateurs ayant les droits //root// en mettant la ligne suivante au dessus de leurs fichiers **crontab** :
PATH=/usr/sbin:/usr/bin:/sbin:/bin
Il est important de vérifier que vos travaux dans **cron** fonctionnent comme prévu. Une méthode pour faire un test est de paramétrer le travail dans la **crontab** pour qu'il se fasse quelques minutes plus tard et de vérifier les résultats, avant de mettre la synchronisation de cette tâche à la bonne heure. Vous pouvez également trouver utile de mettre les résultats des commandes dans un fichier texte qui notent les succès ou les échecs, par exemple :
echo "Sauvegarde de nuit: $(date)" >>/tmp/mybackup.log
**NOTA IMPORTANT:** Dans le cas où votre **crontab** refuserait de s'exécuter, vérifiez que vous disposez bien du package mailutils.
En effet, **cron** logue ses actions en envoyant un mail à l'utilisateur courant.
sudo apt-get install mailutils
edit : si vous ne voulez / pouvez pas envoyer d'email, pas besoin d'installer mailutils, il suffit de rajouter au tout début :
MAILTO=""
et si ça ne marche toujours pas alors il se peut que le démon **cron** soit planté, il faut le réinitialiser en faisant :
sudo restart cron
Pour plus d'information, regardez les pages du //man// pour **cron** et **crontab** (le //man// est détaillé sur [[:tutoriel:console_ligne_de_commande|les commandes basiques]]). Si votre machine est régulièrement éteinte, vous pouvez également être intéréssé par **at** (fait partie de l'installation de base d'Ubuntu ) et **anacron** (à trouver dans le dépôt `universe repository`) qui fournit d'autres approches aux tâches programmées.
Cron, comme [[anacron]] devraient être remplacés par [[fcron]], plus souple et remplissant les fonctions des deux logiciels.
===== Liens =====
* [[http://www.progs.fr/cron-drupal-dédié-ubuntu-server|Cron sur drupal]]
* [[http://www.math-linux.com/spip.php?article16|Programmation des tâches régulières : crontab]]
* [[:nano|Editeur de texte de Crontab : gnu nano]]
----
//Contributeurs : Martigo, [[:contributeurs|Les contributeurs d'Ubuntu-fr]], l'entreprise Simplistay.
//