Au cœur des systèmes d’exploitation de la grande famille Unix, dont font partie les systèmes Linux (dont Android) et macOS, vit un dæmon nommé cron. En tant que dæmon, c’est un programme qui tourne en tâche de fond. Chaque minute, le cron regarde dans un fichier appelé crontab s’il a une commande à lancer à cette date et heure précise, et l’exécute s’il en voit une.
Le crontab est donc un véritable emploi du temps automatisé, que vous pouvez modifier vous-même avec quelques lignes de code pour en faire quelque chose d’utile, d’amusant ou de franchement méchant. Les exemples suivants sont basés sur Ubuntu ; s’ils ne fonctionneront pas forcément tels quels sous macOS, le principe reste le même.
On rappelle que dans un terminal, Ctrl+C et Ctrl+V n’ont pas leur effet habituel, et qu’il faut passer par le clic droit et choisir « copier » ou « coller », ou utiliser le clic du milieu à la place de ce dernier.
Initiation au cronLe cron, par la pratique
Attrapez un terminal (Ctrl+Alt+T sous Ubuntu, ou cherchez-le dans vos applications) et faites crontab -e pour commencer à écrire dans le crontab. Mis à part de longues lignes d’explications, il est vide si vous n’y avez pas touché ; vous pouvez d’ailleurs directement lister le contenu de votre crontab depuis le terminal avec crontab -l.
Ici, les commentaires (précédés d’un #) montrent un exemple pour backuper son dossier Home, contenant tous les utilisateurs, dans une archive .tgz du dossier /var/backups, tous les lundis à 5h du matin.
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
En remplaçant /home/ par le chemin d’un dossier que vous voulez backuper, et /var/backups par le chemin du lieu de backup, vous pouvez vous resservir cette ligne telle quelle… à ceci près que le cron ne fonctionne pas quand l’ordinateur est en veille, et, bien sûr, encore moins quand il est éteint. L’horaire de 5h du matin est donc peu pratique pour une machine personnelle, et il faudra le changer. Voici comment se présente la syntaxe du crontab :
[minute] [heure] [jour] [mois] [jour semaine] [commande]
C’est un peu abstrait ? Mettons-la en pratique avec une ligne de crontab toute simple :
* * * * * ping -D -c 1 www.numerama.com
Elle fait que chaque minute, chaque heure, chaque jour, chaque mois et quelque soit le jour de la semaine, l’ordinateur fera un coucou au site de Numerama pour voir s’il est toujours debout et combien de temps il met à répondre. Le -c 1 lui indique d’envoyer un seul ping ; sinon, il en enverrait un par seconde jusqu’à ce qu’on lui dise de s’arrêter. Le -D lui demande d’écrire le timestamp (le nombre de milisecondes écoulées depuis le début du temps Unix, le 1er janvier 1970) au début de chaque ligne.
On va compliquer un peu en envoyant le ping toutes les 2 minutes et en écrivant le résultat dans un fichier texte. Sinon, seule votre machine voit le résultat du ping et vous n’en serez jamais informé.
*/2 * * * * ping -D -c 1 www.numerama.com >> ~/ping_numerama.txt
Pendant que vous y êtes, vous pouvez écrire une deuxième ligne qui écrira au même moment la date et l’heure dans le même fichier ; ce sera plus lisible qu’un timestamp.
*/2 * * * * date >> ~/ping_numerama.txt
Le précédent exemple permet une prise en main rapide du cron pour vous familiariser avec sa syntaxe, mais il n’a pas une grande utilité pratique. En soi, manier le crontab est simple ; les critères de temps que vous pouvez y rentrer ne sont limités que par votre imagination. Le plus compliqué est de connaître les commandes Unix à mettre dedans. On pourrait passer des heures à les énumérer, alors contentons-nous d’un exemple.
Le crontab est simple ; le plus compliqué est de connaître les commandes à mettre dedans
Mettons que vous voulez, vers la fin de chaque journée de travail, récupérer le poids des différents dossiers de votre ordinateur, avec pour chaque dossier la date de dernière modification ; puis mettre le tout dans un fichier texte incluant dans son nom la date du jour.
La commande qui récupère le poids des dossiers s’appelle du, pour disk usage. L’option -h, ou lisible par un humain, lui permet de s’exprimer en Mo et Go au lieu de purs octets. –time donne le temps de dernière modification des contenus du dossier. Sous Ubuntu, le dossier utilisateur est plein de contenu caché déposé par les divers logiciels (affichable avec Ctrl+H) ; ses noms commencent toujours par un point, et on peut l’exclure de la liste avec –exclude=’./.*’. Si l’on souhaitait en plus écarter tout dossier commençant par « perso », par exemple, on pourrait écrire –exclude=’perso*’. Pour ne pas se retrouver avec l’arborescence complète du système, on peut préciser –max-depth=3, par exemple. La commande regardera alors tous les dossiers dans le dossier utilisateur, et les dossiers encore dedans, et ceux encore dedans, mais pas plus loin.
On a donc cette magnifique commande, que vous pouvez taper dans votre console pour tester : du -h –time –exclude=’./.*’ –max-depth=3
Si on veut la lancer tous les jours du lundi au vendredi à 17h00, on doit ajouter avant, selon la syntaxe du cron, 0 17 * * 1-5. Ensuite, on veut ranger le résultat dans un dossier nommé poids_dossiers, dans un fichier de type dossiers_2016_12_08.txt. La commande date récupèrera la date actuelle ; si vous voulez la mettre en forme en style aaaa_mm_jj_hh:mm:ss, vous écrirez date +%Y_%m_%d_%H :%M :%S. Dans le nom du fichier, pour bien faire comprendre à l’ordinateur que c’est une commande, vous l’encadrerez par des ` (accents graves).
Voici donc le résultat à mettre dans le crontab :
0 17 * * 1-5 du -h –time –exclude=’./.*’ –max-depth=3 >>~/poids_dossiers/dossiers_`date +%Y_%m_%d`.txt
Source: Numerama