Diese Frage ist eine Folgemaßnahme zu: Unterbrechen und Fortsetzen von Prozessen
Ich habe Firefox von einer Bash-Sitzung im Gnome-Terminal gestartet.
Der Prozessbaum sieht folgendermaßen aus:
$ 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
Wenn ich die CTRL+Z
Bash-Taste drücke, wird Firefox deaktiviert. Wenn ich den Befehl bg
(oder fg
) gebe, wird Firefox fortgesetzt. Das ist wie erwartet.
Wenn ich den Befehl kill -s SIGTSTP 27980
in einem anderen Terminal gebe, wird die Zeile [1]+ Stopped firefox
im ersten Terminal gedruckt (genau wie bei einem Treffer CTRL+Z
), aber Firefox wird nicht angehalten. Ich gehe davon aus, dass es nur das Shell-Skript anhält.
Wenn ich den Befehl kill -s SIGTSTP 27989
in einem anderen Terminal gebe (notiere die PID), wird Firefox angehalten. Das erste Terminal nimmt dies nicht zur Kenntnis.
Wie unterbricht bash den gesamten Prozessbaum? Überquert es nur den Baum und SIGTSTP alle Kinder?
quelle
pgid
Ihrenps
Befehl erweitern, um die Prozessgruppen anzuzeigen, über die @geekosaur spricht.Antworten:
Shell-Jobs leben in "Prozessgruppen"; Schauen Sie sich die
PGRP
Spalte in der erweitertenps
Ausgabe an. Diese werden sowohl zur Auftragssteuerung als auch zur Ermittlung des "Besitzers" eines Terminals (real oder pty) verwendet.POSIX (aus System V) verwendet eine negative Prozess-ID, um eine Prozessgruppe anzugeben, da die Prozessgruppe durch den ersten Prozess in der Gruppe ("Prozessgruppenleiter") identifiziert wird.
ps
Dann würden Sie die Prozessgruppe bestimmenkill -s TSTP "-$pgrp"
. (Versuchen Sie esps -u"$USER" -opid,ppid,pgrp,cmd
.)In Ihrem Prozessbaum beginnt die Prozessgruppe mit dem
firefox
Skript, das von gestartet wurdebash
. Die Prozessgruppe wäre also 27980 und der Befehl wäre 27980kill -s TSTP -27980
.Um die Prozessgruppe wieder aufzunehmen, müssen Sie natürlich ausgeben
kill -s CONT -- -27980
.quelle
bash
tut es nicht,SIGTSTP
wenn Sie tippen^Z
; Dafirefox
die Prozessgruppe des Terminals die aktuelle Prozessgruppe ist, sendet der Terminaltreiber (umständlich, Leitungsdisziplin) dasSIGTSTP
an alle Prozesse in dieser Prozessgruppe.bash
ist geradewaitpid()
dabei (und alle anderen Jobs). Andere Anschlusssignale wie^C
und^\
funktionieren auf die gleiche Weise. (meta: SE hasst diesen Strg-Backslash ..)