J'ai le script suivant:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Lorsque j'envoie SIGHUP
(utilise kill -HUP pid
), rien ne se passe.
Si je change légèrement le script:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... alors le script fait ce echo HUP
qu'il faut à sa sortie (lorsque j'appuie sur Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Que se passe-t-il? Comment dois-je envoyer un signal (il ne doit pas nécessairement l'être SIGHUP
) à ce script?
cat
processus. Essayez votre script d'origine et appuyez surCtrl+D
pourcat
quitter le processus. Pendant que lecat
processus est au premier plan, leHUP
signal n'est pas mis à exécution . Essayez à nouveau aveccat
remplacé parread
(un shell intégré).while true; do read; done
à la fin, sinon la saisie de texte le fait également se fermer, et je veux qu'il se ferme sur Ctrl + C.Réponses:
Le manuel de Bash déclare:
Cela signifie que malgré le signal reçu
bash
lorsque vous l'envoyez, votre piège sur SIGHUP ne sera appelé qu'à lacat
fin.Si ce comportement n'est pas souhaitable, alors utilisez soit des commandes
bash
intégrées (par exempleread
+printf
dans une boucle au lieu decat
), soit utilisez des tâches d'arrière-plan (voir la réponse de Stéphane ).la source
@xhienne a déjà expliqué pourquoi , mais si vous vouliez faire agir le signal immédiatement (et ne pas quitter le script), vous pouvez changer votre code en:
La petite danse avec les descripteurs de fichiers consiste à contourner le fait que
bash
redirige stdin vers les/dev/null
commandes lancées en arrière-plan.la source