{{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. //