Ce matin, j'ai décidé de présenter le cron de Linux. Qu'est-ce que le cron ? D'abord, le nom vient du diminutif du mot "chronograph", qui est un programme système qui permet d'exécuter des tâches planifiées dans le temps (job scheduler).
Cron est aussi un daemon, c'est-à dire un processus qui roule en arrière-plan en attendant qu'il soit sollicité. Lorsque le processus est en fonction, il lira les instructions dans un fichier de configuration nommé crontab qui définit à quel moment précis il doit exécuter les tâches. Chaque utilisateur peut avoir son propre crontab mais dans le cadre de ma démonstration, je vais procéder en tant que l'utilisateur root.
Comme tâche, on pourrait faire rouler n'importe quel type de script (Bash, Perl, PHP, etc). Ici, j'en utiliserai un écrit en PHP qui imprimera dans un fichier texte un timestamp par ligne à chaque exécution. J'indiquerai au cron de rouler le script à chaque minute et nous pourrons suivre la progression en temps réel.
1. Exemple de script PHP
$file = "/code18/test/log.txt";À partir de la racine, je placerai ce script dans /code18/test/cron.php.
$fh = fopen($file, 'a') or die("Oups");
fwrite($fh, date("Y-m-d H:i",time()) . "\n");
fclose($fh);
2. Comprendre la syntaxe
Définir un cron se fait par une ligne :
- Les 5 premiers champs représentent la fréquence
- Le 6ème représente la ligne de commande (chemin de l'interpréteur)
- Le 7ème est pour le chemin du script
- Minute de l'heure : 0 à 59
- Heure du jour : 0 à 23
- Jour du mois : 1 à 31
- Mois de l'année : 1 à 12, ou textuel en anglais (voir plus bas)
- Jour de la semaine : 0 à 6, dimanche étant zéro
Par exemple, si on veut rouler le script :
- le 15 du mois : 15
- le 15 et le 30 du mois : 15,30
- du 15 au 20 du mois : 15-20
- tous les jours du mois : *
Ce dernier est pratique pour exécuter quelque chose au moment du démarage de l'ordinateur. Dans mon cas, pour exécuter mon script à chaque minute, la fréquence sera : * * * * *
Pour trouver le chemin de l'interpréteur PHP, on peut utiliser la commande which qui retourne le chemin absolu à utiliser :
which php
Sur ma machine :
/usr/bin/php
Finalment, mon script se trouvera dans /code18/test/cron.php
3. Modifier le fichier crontab
À partir d'un terminal, lancer la commande :
crontab -l
Ceci listera les tâches planifiées pour l'utilisateur courant. Pour en ajouter une, il faudra modifier le fichier de configuration :
crontab -e
Ceci ouvrira le fichier de configuration avec l'éditeur par défaut. Si comme moi vous n'aimez pas vi (lancé par défaut sous Fedora), vous pouvez vous référer à mon entrée de jeudi pour savoir comment le substituer par nano.
Dans le haut de la fenêtre, remarquez le nom du fichier :
File: /tmp/crontab.XXXXXXXXXXX
Ne vous fiez pas au fait qu'il soit dans le répertoire temporaire. Comme vous modifiez le fichier par crontab, il crée une nouvelle tâche et la déplacera automatiquement au bon endroit au moment de la sauvegarde.
Ajoutez la ligne suivante (adaptez la à vos besoins) :
* * * * * /usr/bin/php /code18/test/cron.php
Enregistrez le fichier et sortez de nano. Créé en tant que root, les instructions sont placées dans le fichier /var/spool/cron/root.
4. Est-ce que ça marche ?
Exécutez à nouveau crontab -l pour vous assurer que la tâche a bien été ajoutée. Vous devriez voir la ligne s'afficher. Maintenant, je veux m'assurer que le script fonctionne bien. Je vais l'ouvrir avec less
less /code18/test/log.txt
Une fois less lancé, je peux suivre la progression de ce qui est ajouté à la fin du fichier en faisant la combinaison des touches SHIFT+F. À chaque minute, un enregistrement sera ajouté à la fin et je le verrai apparaître (vous verrez un message "Waiting for data"). CTRL+Z pour sortir de ce mode.
5. Supprimer les tâches
Vous pouvez retirer la ligne du fichier ou simplement appeler la commande crontab -r pour tout effacer les ordres.