Planification de tâche via 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 :

cron1.png

Moi je vais utiliser nano (oui c’est le plus simple ). Tapez sur « 2 » puis « Entrée » et voici ce que vous obtiendrez :

cron2.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 :

cron3.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 :

cron4.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

cron5.png

Que se passerait-il si une des tâches que vous avez planifié via cron n'est pas lancée pour diverses raisons (probablement parce que votre PC n'est pas allumé) ? Eh bien la tâche n'est pas exécutée tout simplement. Bon heureusement pour nous il existe un second programme qui va nous aider à régler ce genre de problématiques : anacron.

En fait Cron est un outil à utiliser sur des machines de type serveur qui sont toujours up. Anacron en revanche est utilisable sur des machines personnelles (des PC). En effet anacron utilise des indications de temps relative (est ce que la tâche a été exécuté aujourd'hui, cette semaine ou encore ce mois-ci). Si ce n'est pas le cas alors il va lancer la tâche.

Ainsi si vous avez planifié une tâche cron qui n'a pas été exécuté parce que votre PC était éteint eh bien au démarrage cette dernière sera exécutée par anacron.

Pour ma part je fais une backup de whiteflag toutes les semaines. Pour cela j'ai édité le fichier /etc/anacrontab de cette manière:

30 15 whiteflag_backup bash /home/defte/tools/whiteflag.sh

Qui indique à anacron qu'il doit exécuter le script whiteflag.sh tous les 30 jours 15 minutes après que mon PC ait booté.

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} :

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

cron7.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=""

cron8.png

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à !