spoolsh est un utilitaire UNIX permettant de surveiller un fichier texte et de lancer des commandes shell depuis ce fichier texte. La différence avec un simple "sh monfichier" est que spoosh ne fini jamais. Si il atteint la fin du fichier, il attend de nouvelles commandes à la façon d'un "tail -f".
usage
Normalement, spoolsh est utilisé sous la forme d'un daemon. On utilise l'utilitaire UNIX "nohup" pour détacher le programme du terminal courant, et le caractère "&" final pour le mettre en tâche de fond.
nohup spoolsh monfichier &
Si vous n'utilisez pas "nohup" et "&", le programme ce lancera en mode debug et vous pourrez l'arrêter avec un simple Ctrl+C.
spoolsh prend en paramètre un fichier texte. Ce fichier a un format spécifique:
- Le premier caractère de chaque ligne doit être un espace, ou la ligne est ignorée.
- Les caractères qui suivent l'espace ne sont pas analysés jusqu'au prochain caractère ':'.
- La chaîne de caractère qui suit la première occurence d'un caractère ':' est la commande à exécuter.
Fonctionnalités
- Lancement linéaire de commandes shell
- Annulation des lignes traitées pour pouvoir relancer spoolsh après un plantage éventuel
- Information sur les plantages des commandes
Technologie
Ce programme est extraimement simple. Il est écrit en C ANSI pur.
Il ne fait que lire les lignes d'un fichier texte, repérer celles qui commence par un espace, rechercher la ligne de commande à éxécuter en recherchant la première occurence du caractère deux-points qui sert de délimiteur, puis il lance un system() sur cette commande.
Une fois la commande executé, spoolsh remplace l'espace de début de ligne par un autre caractère de façon à ce que cette ligne ne soit plus traitée.
Discution
J'ai écrit ce programme pour résoudre un problème important pour moi : la fiabilité de mon serveur web.
En effet, j'ai écrit de nombreux CGI qui font quelques fois des opérations complexe et longue (un script tournant plus de 1 seconde est trop long). Ces scripts fonctionnaient très bien, mais si 100 utilisateurs les utilisaient en même temps, cela risquait de saturer le serveur et d'entrainer un "deny of service".
Par exemple, la transformation d'image par script web en utilisant ImageMagick ne peut pas raisonnable se faire dans le script CGI. A la place, j'écrit 2 scripts maintenant :
- Le premier script est le script CGI qui ne fait que écrire une ligne de texte dans un fichier texte en append.
- Le deuxième script effectue l'opération complexe et est indépendant du serveur web.
spoolsh lance les commandes les unes après les autres, ce qui garantie la stabilité du serveur (aussi bien en terme de mémoire que de CPU). De plus les opérations sont aussi rapide qu'avant (sauf dans le cas d'un serveur multicoeur).
Evidemment, le script CGI doit intégrer un système d'attente pour vérifier que l'opération est fini, mais le prix à payé est mince au regard de l'amélioration obtenu.