{{tag>système administration}} ---- ====== Programmer des tâches avec CRON ====== ===== Qu'est-ce que Cron ? ===== **Cron** est le gestionnaire des tâches devant être exécutées à un moment précis. Chaque utilisateur a un fichier **crontab**, lui permettant d'indiquer les actions à effectuer régulièrement. ===== 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 **cron**. Les champs, dans l'ordre(( Le mois et le jour de la semaine permettent une abréviation (suivant les jours et mois en anglais), telle que **jan** pour janvier, **thu** pour jeudi (Thursday).)) : * //minute//, * //heure//, * //jours dans le mois//, * //mois//. * //jour de la semaine// * La commande à lancer. ---- Si __//jour du mois//__ et __//mois//__ sont définis, __//jour de la semaine//__ n'est pas nécessaire. Cependant, si le champ est indiqué en plus, la commande sera executée à la date //jour du mois// et //mois// mais AUSSI tous les //jour de la semaine// définis. Exemple avec 0 0 13 1 5 tâche la tâche sera exécutée le 13 janvier ET tous les vendredis. ---- L'exemple ci-dessous 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**. 5 3 * * * nomdutilisateur /usr/bin/apt-get update ---- 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" Vous pouvez générer une commande grâce à **[[http://www.openjs.com/scripts/jslibrary/demos/crontab.php|cet outil]]**. ===== 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 ou par : select-editor Lors du premier accès à "crontab -e" un menu apparaît et donne le choix de l'éditeur à utiliser. ===== 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 aussi important de noter que le fichier **crontab** de l'utilisateur système ''root'' peut être édité avec l'instruction sudo crontab -e . Dans ce cas il ne faut pas préciser l'utilisateur sinon ''root'' est compris comme une instruction à exécuter et il ne se passera rien. * Bon : @midnight /sbin/shutdown -r now> * Mauvais : @midnight root /sbin/shutdown -r now (Vérifié avec ubuntu-server 14.04.1, xubuntu 14.04.1 et xubuntu 16.0.1) 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 Si vous ne voulez ou 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 service cron restart 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éressé 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. **NOTE:** pour modifier crontab directement (par un script par exemple) crontab < <(crontab -l ; echo "0 * * * * echo plop") Cron, comme [[anacron]] devraient être remplacés par [[fcron]], plus souple et remplissant les fonctions des deux logiciels.\\ 18/07/2014 : une version stable de fcron est disponible [[http://fcron.free.fr/]] ===== Liens ===== * [[https://help.ubuntu.com/community/CronHowto]] (EN) * [[http://www.math-linux.com/spip.php?article16|Programmation des tâches régulières : crontab]] * [[:nano|Editeur de texte de Crontab : gnu nano]] * [[incron]] : effectuer une action, commande(s), scripts, etc, en cas de modifications de fichiers ou de répertoires donnés * [[https://www.easycron.com/|EasyCron - Cron Jobs Alternatives]] * [[:Anacron]] : planificateur de commande « anachronique » * [[fcron]] : programmer des tâches devant être exécutées ---- //Contributeurs : Martigo, [[:contributeurs|Les contributeurs d'Ubuntu-fr]], l'entreprise Simplistay. //