Planifier des tâches avec cron

Cron ou crontab (abréviation de Chrono Table), en français table de planification est un programme UNIX qui permet de planifier des tâches récurrentes. Avec cron on va pouvoir planifier une back-up automatique toutes les 2 semaines, mettre en route un serveur apache2 entre 8H du matin et 19H le soir etc…

Cron est un processus qui fonctionne en arrière plan et qui utilise une horloge afin d’exécuter les actions voulues au bon moment. A première vue ça parait très compliqué à utiliser alors qu’en fait pas du tout !

Pour configurer une nouvelle planification il suffit d’entrer cette commande :

crontab -e

La première fois que vous utiliserez crontab, un message vous demandera quel éditeur de texte vous souhaitez utiliser :

ask.png

Moi j’aime pas du tout vim donc je vais utiliser nano (oui c’est le plus simple 😉). Tapez sur « 2 » puis « Entrée » et voici ce que vous obtiendrez :

crontabdesc.png

En lisant la documentation on apprend qu’il faut respecter une syntaxe qui est la suivante :

"minute" "heure" "jour du mois" "mois" "jour de la semaine" "commande"

Notez bien que si les arguments jour du mois et mois sont renseignés alors vous n’êtes pas obligé de renseigner le jour de la semaine. Si vous le faites quand même alors l’action s’exécutera à la date du jour du mois mais aussi à la date du jour de la semaine.

Voici un exemple de tâche que j’ai crée :

tache.png

Ici j’ai déclaré que je voulais que la commande :

/etc/init.d/apache2 start

Soit exécutée tous les jours de tous les mois à 15H22.

Au niveau des valeurs possibles, voici les ranges :
-Les minutes vont de 0 à 59
-Les heures vont de 0 à 23
-Les jours du mois vont de 0 à 31
-Les mois vont de 0 à 12
-Les jours de la semaine vont de 0 à 6 (Dimanche = 0, Samedi = 6)

Il existe aussi des raccourcis qui permettent de simplifier la création de ces tâches :

Raccourcis Description Équivalent
@reboot Au démarrage du système Aucun
@yearly Tous les ans 0 0 1 1 *
@annually Tous les ans 0 0 1 1 *
@monthly Tous les mois 0 0 1 * *
@weekly Toutes les semaines 0 0 * * 0
@daily Tous les jours 0 0 * * *
@midnight Tous les jours 0 0 * * *
@hourly Toutes les heures 0 * * * *

Par exemple si vous voulez faire un backup automatique de votre /home toutes les semaines vous pourrez écrire ceci :

@weekly tar -cvf /home/{nom d'utilisateur}

Si c’est un script qui s’occupe du backup vous pourrez dire à cron de lancer le script de backup comme ceci :

@weekly /bin/bash backup.sh

En utilisant le raccourci @weekly vous demandez à cron de lancer la tâche de backup toutes les semaines le dimanche à minuit.

D’ailleurs si vous avez du mal avec le système de cron je vous invite à vous rendre ici. Ce site vous permettra d’éditer vos règles cron très facilement :

crontabguru.png

Suivant les tâches que vous voulez faire vous serez plus ou moins bloquer. En effet quand vous lancez la commande crontab -e vous éditez le fichier cron pour votre utilisateur et donc vous pourrez exécuter des actions en fonction des droits de l’utilisateur. Du coup si vous voulez lancer un serveur apache2 via cron il faudra le faire à partir du fichier cron de l’utilisateur root.

Pour cela il faudra utiliser cette commande :

crontab -u root -e

Et là vous pourrez ajouter vos tâches. Ensuite si vous voulez visualiser les tâche que vous avez crée il vous suffira d’entrer cette commande :

crontab -l

crontabl.png

Dernière chose, si une tâche ne s’exécute pas correctement, un mail vous sera envoyé dans le fichier /var/mail/{nom_d_utilisateur} :

mailcront.png

Si vous ne voulez pas les recevoir, il vous suffira d’ajouter « &> /dev/null » à la suite de votre tâche :

nomail.png

Et si vraiment vous ne voulez jamais recevoir de notifications alors il vous suffira de rajouter ceci au tout début du fichier crontab -e:

MAILTO=""

nevereversendmemailaboutcron

Bien évidemment vous pouvez aussi mettre une autre adresse, genre votre mail personnel 😎 !

Cron s’avère donc être un outil vraiment sympas. Il peut même être utilisé par un attaquant afin de créer de la persistance. Par exemple on pourrait demander à cron de mettre en écoute netcat sur un port spécifique toutes les heures ce qui permettrait à un pirate de prendre la main à distance. Voilà voilà !

Un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s