Je cherche à ce qu’un script shell reste ouvert comme un démon au lieu de rendre la main après s’être exécuté. Comme un démon, je veux qu’il réagisse en se terminant de lui-même quand il reçoit une demande de SIGTERM.
Ma première approche c’est une boucle infinie avec un sleep.
trap 'quit' SIGTERM SIGKILL
function quit() {
exit 1
}
while true; do
sleep 10
done
Le trap n’interrompt pas le sleep. J’ai mis 10 secondes pour garder une réactivité raisonnable à l’extinction.
Même si un réveil toutes les 10 secondes est probablement insignifiant, quelque chose en moi est quand même gêné et aurait aimé mettre plusieurs heures ici.
Je vois sur le web pas mal d’exemples avec un sleep 1, qui m’interroge encore plus. Quel est le coût réel de ce sleep 10 dans une boucle infinie ?
Certains ont élaboré des solutions pour rendre le sleep interruptible en l’envoyant en tâche de fond :
PID=
trap '[[ $PID ]] && kill "$PID"' SIGTERM SIGKILL
while true; do
sleep 100000 & pid=$!
wait
done
Je vois aussi, et ça m’a l’air simple & smart, des scripts utiliser des readline plutôt que des sleep. Les readline ont la bonne idée d’être interruptibles et de durée infinie tant qu’on n’envoie rien sur stdin.
trap 'quit' SIGTERM SIGKILL
function quit() {
exit 1
}
read
Dites, les amateurs de shell, quelle est la méthode recommandée pour garder un script ouvert en tâche de fond ? Est-ce qu’il y a une réelle différence entre ces méthodes ou est-ce juste une question de style ?
Laisser un commentaire