cette question fait suite à: comment suspendre et reprendre les processus
J'ai démarré Firefox depuis une session bash dans gnome-terminal.
L'arbre de processus ressemble à ceci:
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
Quand je frappe CTRL+Z
en bash, cela suspendra Firefox. Lorsque j'émets la commande bg
(ou fg
), elle reprendra Firefox. C'est comme prévu.
Lorsque j'émets la commande kill -s SIGTSTP 27980
dans un autre terminal, il imprimera la ligne [1]+ Stopped firefox
dans le premier terminal (comme lorsque je frappe CTRL+Z
), mais il ne suspend pas Firefox. Je suppose que cela suspend uniquement le script shell.
Lorsque j'émets la commande kill -s SIGTSTP 27989
(notez le PID) dans un autre terminal, il suspendra Firefox. Le premier terminal n'en prend pas note.
Comment bash suspend-il l'intégralité de l'arborescence des processus? traverse-t-il simplement l'arbre et SIGTSTP tous les enfants?
la source
pgid
à votreps
commande pour voir les groupes de processus dont parle @geekosaur.Réponses:
Les emplois Shell vivent dans des "groupes de processus"; regardez la
PGRP
colonne dans laps
sortie étendue . Ceux-ci sont utilisés à la fois pour le contrôle des travaux et pour déterminer à qui "appartient" un terminal (réel ou pty).POSIX (tiré de System V) utilise un ID de processus négatif pour indiquer un groupe de processus, car le groupe de processus est identifié par le premier processus du groupe ("chef de groupe de processus"). Donc, vous utiliseriez alors
ps
pour déterminer le groupe de processuskill -s TSTP "-$pgrp"
. (Essayezps -u"$USER" -opid,ppid,pgrp,cmd
.)Dans votre arborescence de processus, le groupe de processus commence par le
firefox
script lancé parbash
, donc le groupe de processus serait 27980 et la commande seraitkill -s TSTP -27980
.Naturellement, pour reprendre le groupe de processus, question
kill -s CONT -- -27980
.la source
bash
ne fait pas leSIGTSTP
lorsque vous tapez^Z
; puisquefirefox
le groupe de processus de est le groupe de processus actuel du terminal, le pilote de terminal (pédantiquement, discipline de ligne) envoie leSIGTSTP
à tous les processus de ce groupe de processus.bash
est justewaitpid()
sur elle (et tout autre emploi). D'autres signaux terminaux, tels que^C
et^\
fonctionnent de la même manière. (méta: SE déteste cette ctrl-backslash ..)