Étant donné un processus shell (par exemple, sh
) et son processus enfant (par exemple cat
), comment puis-je simuler le comportement de Ctrl +C en utilisant l'ID de processus du shell ?
Voici ce que j'ai essayé :
Exécution de sh
puis cat
:
[[email protected] ~]$ sh
sh-4.3$ cat
test
test
Envoi de SIGINT
à cat
depuis un autre terminal :
[[email protected] ~]$ kill -SIGINT $PID_OF_CAT
cat
a reçu le signal et s'est terminé (comme prévu).
L'envoi du signal au processus parent ne semble pas fonctionner. Pourquoi le signal n'est-il pas propagé à cat
lorsqu'il est envoyé à son processus parent sh
?
Cela ne fonctionne pas :
[[email protected] ~]$ kill -SIGINT $PID_OF_SH
Réponse acceptée :
Comment CTRL +C fonctionne
La première chose est de comprendre comment CTRL +C fonctionne.
Lorsque vous appuyez sur CTRL +C , votre émulateur de terminal envoie un caractère ETX (fin de texte / 0x03).
Le TTY est configuré de telle sorte que lorsqu'il reçoit ce caractère, il envoie un SIGINT au groupe de processus de premier plan du terminal. Cette configuration peut être visualisée en faisant stty -a
et en regardant intr = ^C;
.
La spécification POSIX indique que lorsque INTR est reçu, il doit envoyer un SIGINT au groupe de processus de premier plan de ce terminal.
Quel est le groupe de processus de premier plan ?
Donc, maintenant la question est, comment déterminez-vous ce qu'est le groupe de processus de premier plan ?
Le groupe de processus de premier plan est simplement le groupe de processus qui recevra tous les signaux générés par le clavier (SIGTSTP, SIGINT, etc.).
Le moyen le plus simple de déterminer l'ID du groupe de processus consiste à utiliser ps
:
ps ax -O tpgid
La deuxième colonne sera l'ID du groupe de processus.
Comment puis-je envoyer un signal au groupe de processus ?
Maintenant que nous connaissons l'ID du groupe de processus, nous devons simuler le comportement POSIX consistant à envoyer un signal à l'ensemble du groupe.
Cela peut être fait avec kill
en mettant un -
devant l'ID de groupe.
Par exemple, si votre ID de groupe de processus est 1234, vous utiliserez :
kill -INT -1234
Simuler CTRL +C en utilisant le numéro du terminal.
Ainsi, ce qui précède explique comment simuler CTRL +C comme un processus manuel. Mais que se passe-t-il si vous connaissez le numéro TTY et que vous souhaitez simuler CTRL +C pour ce terminal ?
Cela devient très facile.
En relation :Bash convertit \xC3\x89 en É ?
Supposons $tty
est le terminal que vous souhaitez cibler (vous pouvez l'obtenir en exécutant tty | sed 's#^/dev/##'
dans le terminal).
kill -INT -$(ps h -t $tty -o tpgid | uniq)
Cela enverra un SIGINT à n'importe quel groupe de processus de premier plan de $tty
est.