5 exemples de Crontab pour vous aider à automatiser les tâches Linux
Le programme cron automatise l'exécution d'autres programmes sous Linux. Cron est un démon qui s'exécute en continu et démarre d'autres programmes selon un calendrier donné. Plusieurs fichiers différents définissent ce planning. Ils sont individuellement connus sous le nom de crontabs.
Cron peut planifier n'importe quelle commande ou tâche Unix. Parfois, vous voudrez travailler avec une simple commande. D'autres fois, vous aurez besoin d'écrire un script pour effectuer la tâche complète. Cron fonctionne bien avec l'une ou l'autre approche. Il prend également en charge des règles de planification complexes et des moyens flexibles de traiter la sortie du script.
Que vous effectuiez des tâches utilisateur simples ou une administration système complète, il est indispensable de comprendre le fonctionnement de cron à l'aide d'exemples pratiques.
1. Nettoyer /tmp à l'aide d'une crontab à l'échelle du système
Le répertoire /tmp est un emplacement temporaire pour une utilisation générale par tout programme ou utilisateur du système. De nombreux systèmes Unix supprimeront les anciens fichiers du répertoire /tmp au démarrage. D'autres planifient cette opération, assez souvent en utilisant cron.
Cependant, si vous souhaitez un contrôle personnalisé sur ce processus ou si vous souhaitez l'appliquer à un autre répertoire, la configuration d'une tâche cron rapide est un moyen simple de le faire.
Voici une façon de nettoyer /tmp, ou tout autre répertoire de votre choix :
1 3 * * * /usr/bin/find /tmp -type f -atime +10 -delete
À trois heures une minute, chaque jour, cron exécutera cette commande. Il utilise la commande find pour rechercher des fichiers dans le répertoire /tmp. Il filtre tout sauf les fichiers normaux qui ont été modifiés pour la dernière fois il y a au moins 10 jours. Il supprime ensuite tous ces fichiers qu'il trouve.
Vous devez ajouter une commande comme celle-ci à une crontab globale telle que /etc/crontab ou à la crontab de root en utilisant sudo crontab -e . La commande doit s'exécuter en tant que root pour pouvoir supprimer les fichiers dans /tmp, quel que soit leur propriétaire.
Notez que cet exemple spécifie le chemin complet de la commande find. Cron utilise un paramètre PATH de base pour rechercher des exécutables, donc si la commande se trouve à un endroit standard (comme /usr/bin ), ce n'est pas vraiment nécessaire. Vous pouvez spécifier un PATH alternatif dans la crontab elle-même si vous préférez cette approche. Mais utiliser un chemin complet pour les commandes est un peu plus résistant.
Si vous travaillez sur un projet qui écrit des journaux ou stocke des données en cache, ce type d'approche peut être vital si vous supprimez des fichiers pour libérer de l'espace disque. Bien que l'exemple ci-dessus soit une approche simple et rapide, vous devez utiliser une commande telle que tmpwatch , si elle est disponible.
2. Sauvegardes de la base de données deux fois par jour
À partir de maintenant, concentrons-nous sur les tâches spécifiques à l'utilisateur que vous pouvez gérer via votre crontab locale. Vous pouvez modifier la crontab de votre utilisateur actuel à l'aide de la commande suivante :
crontab -e
Cette crontab doit contenir des tâches spécifiques à votre compte utilisateur. Imaginez que vous travaillez sur un projet impliquant le remplissage d'une base de données MySQL. Vous pouvez utiliser l'outil mysqldump pour créer un dump SQL d'une base de données entière. En redirigeant sa sortie, vous pouvez avoir des sauvegardes de base de données simples et planifiées.
30 4 * * * /usr/local/mysql/bin/mysqldump --login-path=local --databases albums > /tmp/album-db.$(date +%s).sql
Par défaut, cron envoie la sortie (y compris les erreurs) par e-mail à l'utilisateur auquel appartient le fichier crontab. Mais vous pouvez rediriger la sortie de la même manière que vous le feriez à partir d'une ligne de commande, en utilisant la notation de nom de fichier > .
Notez comment l'exemple ci-dessus utilise la substitution de commande pour créer le nom de fichier en fonction de l'horodatage Unix actuel. Étant donné que le symbole % a une signification particulière pour cron, la commande doit l'échapper avec une barre oblique inverse précédente.
3. Vérification de la disponibilité du site avec un script personnalisé
Vous avez peut-être remarqué que la commande du dernier exemple était trop longue. Heureusement, rien ne vous empêche d'enregistrer des commandes dans un script et d'exécuter ce script via votre crontab. Voici un exemple qui exécute un script toutes les minutes :
* * * * * /Users/bobby/bin/site-monitor.sh
Notez qu'en théorie, vous pouvez utiliser la variable HOME ou l'extension tilde pour une commande plus courte :
* * * * * ~/bin/site-monitor.sh
Vous pouvez choisir d'éviter de le faire, au cas où cron cesserait de le prendre en charge. Il n'y a aucun mal à utiliser le chemin complet et il est sans doute plus lisible.
Le script lui-même utilise le programme curl pour récupérer le code d'état HTTP pour une URL donnée. Si l'état indique autre chose que la réussite, le script écrit un message dans la sortie.
Comme mentionné précédemment, cron nous enverra cette sortie par e-mail. Il peut être utile que les commandes dans cron ne produisent aucune sortie en cas de succès.
#!/bin/bash
STATUS=`curl -s -o /dev/null -I -w "%{http_code}" http://example.com/`
if [ "$STATUS" != "200" ]
then
echo "site appears to be down"
fi
4. Rapports d'espace disque par e-mail
Si vous souhaitez modifier le comportement d'e- mail par défaut de cron, vous pouvez utiliser la variable d'environnement MAILTO . Cron prend en charge quelques variables que vous pouvez définir dans votre fichier crontab. Cron applique ensuite ces variables à l'environnement de chaque commande qui suit.
Pour définir une adresse e-mail cible alternative, utilisez le format suivant :
[email protected]
Vous devrez l'exécuter sur une machine configurée pour envoyer un e-mail externe si nécessaire. Voici un exemple qui enverra un e-mail à un autre utilisateur sur la même machine. Il circule deux fois par jour, à 12h00 et 23h00. La commande df affiche l'espace disque libre, donc cette entrée crontab délègue la tâche de vérifier que l'espace disque semble correct :
MAILTO="sarah"
0 12,23 * * * /bin/df -h
L'e-mail résultant ressemblera à ceci :
Notez que cron ajoute ses propres en-têtes d'e-mails personnalisés. Ceux-ci peuvent être utiles pour le débogage. Vous pouvez également désactiver le comportement d'e-mail par défaut de cron en utilisant une chaîne vide :
MAILTO=""
5. Diffusez un message à des heures précises
Les autres exemples utilisent une planification assez simple, mais cron prend en charge une syntaxe puissante pour les spécifications de temps. Il gère non seulement les correspondances exactes, mais aussi :
- Plusieurs valeurs séparées par des virgules ( , )
- Plages spécifiées avec un tiret ( – )
- Valeurs de pas après une barre oblique ( / )
Ainsi, par exemple, si vous souhaitez envoyer un message à tous les utilisateurs connectés, deux fois par heure pendant les heures de travail, mais seulement toutes les trois heures, quelque chose comme ce qui suit suffira :
0 15,45 9-17/3 ? * * * echo 'Enjoy your work!' | wall
Cette commande s'exécutera à 15 et 45 minutes après l'heure, toutes les trois heures pendant les heures de 9h à 17h. La commande wall envoie un message à chaque utilisateur du terminal connecté.
Vous pourriez même constater que cron offre une planification plus flexible que votre application de calendrier. Certaines variantes vous permettent de spécifier des commandes à exécuter le deuxième vendredi d'un mois ou le jour de la semaine le plus proche d'une certaine date.
Cron peut automatiser de nombreux types de tâches Linux
Ceci est une petite sélection du type de tâches que cron peut vous aider à automatiser. Cela peut prendre un certain temps pour se familiariser avec la syntaxe complexe, mais cron est un utilitaire puissant. Vous pouvez utiliser cron pour les tâches à l'échelle du système et celles spécifiques à l'utilisateur.
Avec une syntaxe compliquée pour la planification, cron est puissant, mais vous devriez probablement avoir une bonne référence sous la main. Les crontabs autorisent les commentaires, vous pouvez donc inclure une ligne de commentaire dans la vôtre pour documenter les champs de temps.