So können Sie Prozesse wie bei bash anhalten und wieder aufnehmen

13

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+ZBash-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 27980in einem anderen Terminal gebe, wird die Zeile [1]+ Stopped firefoxim 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 27989in 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?

Lesmana
quelle
2
Siehe auch Unterschied zwischen Prozessgruppe und Job? .
Gilles 'SO - hör auf böse zu sein'
Sie sollten pgidIhren psBefehl erweitern, um die Prozessgruppen anzuzeigen, über die @geekosaur spricht.
Ninjalj

Antworten:

17

Shell-Jobs leben in "Prozessgruppen"; Schauen Sie sich die PGRPSpalte in der erweiterten psAusgabe 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. psDann würden Sie die Prozessgruppe bestimmen kill -s TSTP "-$pgrp". (Versuchen Sie es ps -u"$USER" -opid,ppid,pgrp,cmd.)

In Ihrem Prozessbaum beginnt die Prozessgruppe mit dem firefoxSkript, das von gestartet wurde bash. Die Prozessgruppe wäre also 27980 und der Befehl wäre 27980 kill -s TSTP -27980.

Um die Prozessgruppe wieder aufzunehmen, müssen Sie natürlich ausgeben kill -s CONT -- -27980.

Geekosaurier
quelle
7
Übrigens, bashtut es nicht, SIGTSTPwenn Sie tippen ^Z; Da firefoxdie Prozessgruppe des Terminals die aktuelle Prozessgruppe ist, sendet der Terminaltreiber (umständlich, Leitungsdisziplin) das SIGTSTPan alle Prozesse in dieser Prozessgruppe. bashist gerade waitpid()dabei (und alle anderen Jobs). Andere Anschlusssignale wie ^Cund ^\ funktionieren auf die gleiche Weise. (meta: SE hasst diesen Strg-Backslash ..)
Geekosaurier