Ce projet a été développé dans le cadre de ma troisième année de Licence d'Informatique. L'objectif principal était de concevoir de A à Z un gestionnaire de tâches périodiques, fortement inspiré de l'utilitaire classique cron sous Linux. Le système repose sur une architecture client-serveur locale, conçue pour planifier, exécuter de manière autonome et surveiller une grande variété de commandes.
Il met en pratique les concepts fondamentaux de la programmation système. Le cœur de l'application est un démon (le serveur erraid) qui s'exécute en tâche de fond, et qui est détaché du terminal utilisateur. Ce serveur gère l'horloge interne et gère l'exécution des tâches en s'appuyant sur la gestion classique des processus (fork, exec, waitpid). Pour interagir avec erraid, une interface en ligne de commande (le client tadmor) permet d'envoyer des requêtes de planification. La communication entre ce client et le démon est assurée par des mécanismes de communication, les tubes nommés (FIFO).
Ce planificateur a la capacité à traiter des commandes complexes. En plus des exécutions simples, le système gère de arborescences de tâches. Il est ainsi possible de lier plusieurs processus entre eux, que ce soit sous forme de séquences, de pipelines en utilisant des tubes anonymes, ou encore d'exécutions conditionnelles.
Enfin, la gestion des entrées/sorties a été pensée pour rediriger les flux standards vers des fichiers de logs, permettant de consulter la sortie ou les erreurs d'une tâche. De plus, l'état complet du serveur et de l'arborescence des tâches est régulièrement sérialisé et sauvegardé sur le disque dur. Pour garantir la compatibilité des données, cette sérialisation binaire utilise le format d'encodage big-endian (convention réseau standard). Cette persistance des données a été mise en place pour que le système puisse résister à une interruption et reprendre son fonctionnement normal après un redémarrage.
- Gestion des processus : Utilisation de
fork,execetwaitpidpour l'exécution des tâches en arrière-plan. - Communication entre processus : Utilisation de tubes anonymes (
pipe) pour les commandes en pipeline et de tubes nommés (FIFO) pour la communication entre le client et le serveur. - Démonisation : Création d'un service s'exécutant en tâche de fond (
erraid) indépendamment du terminal. - Entrées/Sorties : Redirection des flux standards (
dup2) vers des fichiers de logs et sérialisation binaire pour sauvegarder l'état des tâches sur le disque.
- Client de contrôle (
tadmor) : Interface en ligne de commande pour interagir avec le démon. - Démon (
erraid) : Serveur en arrière-plan gérant l'horloge et l'exécution. - Persistance : Sauvegarde de l'arborescence des tâches sur le disque pour résister aux redémarrages.
- Combinaisons de tâches : Support des exécutions séquentielles (
;), en pipeline (|) et conditionnelles (if/then/else).
Le projet est conçu pour s'exécuter sur un environnement Linux.
# compiler
make
# nettoyer les fichiers compilés
make distclean
Le système fonctionne en deux temps : il faut d'abord démarrer le serveur (erraid) qui va tourner en arrière-plan pour gérer l'horloge. Ensuite, dans un autre terminal, on utilise le client (tadmor) pour lui envoyer des tâches et les surveiller.
# lancement par défaut (en arrière-plan)
./erraid
# lancement au premier plan
./erraid -F
Voici les différentes commandes pour planifier et gérer les tâches.
# lancer un script de sauvegarde tous les lundis (jour 1) à 19h30
./tadmor -c -m 30 -H 19 -d 1 echo "Début de la sauvegarde"
# le système renvoie un identifiant (ID) unique pour cette tâche, par exemple : 81
./tadmor -c -n ping -c 1 google.com # Renvoie l'ID 85
./tadmor -c -n echo "Réseau OK" # Renvoie l'ID 86
./tadmor -c -n echo "Erreur réseau" # Renvoie l'ID 87
# exécution à la suite : lance la tâche 85, puis la 86, toutes les heures pile (minute 0)
./tadmor -s -m 0 85 86
# utilisation d'un tube (pipeline) : le résultat de la tâche 86 est directement envoyé à la 87
./tadmor -p -m 0 86 87
# exécution conditionnelle : si la tâche 85 réussit, on lance la 86, sinon on lance la 87
./tadmor -i -m 0 85 86 87
# afficher la liste de toutes les tâches actuellement planifiées
./tadmor -l
# consulter l'historique des résultats (codes de retour) d'une tâche précise (ex: ID 81)
./tadmor -x 81
# afficher la sortie standard de la dernière exécution
./tadmor -o 81
# afficher la sortie d'erreur de la dernière exécution
./tadmor -e 81
# supprimer une tâche du planificateur
./tadmor -r 81
# arrêt propre du serveur
./tadmor -q