Wie können Terminalemulatoren ihre Kinder töten, nachdem sie SIGKILL erhalten haben?

12

Soweit ich weiß, ist SIGKILL nicht zu fassen. Dies würde bedeuten, dass ein Prozess keine Zeit hat, seine Kinder zu töten, bevor das Betriebssystem es zerstört. Dies kann mit einem Shell-Skript demonstriert werden.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Wenn du es mit SIGKILL tötest, läuft mplayer weiter.

$ kill -9 $pid

Bei Verwendung eines Terminal-Emulators (xterm, Terminal, ...) werden jedoch auch Kinder getötet. Wie ist das möglich?

$ mplayer

Und töte es:

$ kill -9 $terminal_pid

Und der Spieler geht mit dem Schiff unter. Fangen Terminal-Emulatoren irgendwie SIGKILL oder ist hier eine andere Kraft am Werk?

Kevin Cox
quelle

Antworten:

11

Der Prozess, der von gestartet wird, xtermwird der Sitzungsleiter sein, der die Kontrolle über das Terminal hat.

Wenn das Terminal ausgeht, empfängt dieser Prozess automatisch ein SIGHUP-Signal (gefolgt von einem SIGCONT). Dies wird vom Kernel auf ähnliche Weise gesendet, wie Prozesse SIGINT empfangen, wenn Sie STRG-C drücken.

Zusätzlich kann eine Shell beim Beenden SIGHUP an einige ihrer Kinder senden (siehe disownin einigen Shells, um dies zu deaktivieren).

Stéphane Chazelas
quelle
1
Informationen zu Sitzungen und Sitzungsleitern finden Sie unter unix.stackexchange.com/questions/18166/… .
Kevin Cox
+1 für disowndie sehr nützlich ist.
Mathe
1

Ihre Frage beantwortet sich von selbst. Dies geschieht, weil diese Prozesse als untergeordnete Prozesse unter dem Terminalemulator ausgeführt werden. Sie beenden also den Terminalemulator und beenden dabei alle untergeordneten Prozesse (da die untergeordneten Prozesse unter derselben Prozessgruppe wie der steuernde Terminalemulator ausgeführt werden).

Siehe zum Beispiel Folgendes:

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

Alle diese Prozesse werden unter den 'xfce4-terminal'-Prozessen ausgeführt. Wenn ich diesen Prozess abbringe, werden alle untergeordneten Prozesse in der Prozessgruppe automatisch abgebrochen unbedingt meine SSH-Verbindung abbrechen.

Programme wie Shells erstellen neue Prozessgruppen und ordnen in der Regel verwandte untergeordnete Prozesse einer Gruppe zu. Jeder Job ist eine Prozessgruppe. Außerhalb des Kernels manipuliert eine Shell einen Job, indem sie mit dem Systemaufruf killpg Signale an die Prozessgruppe des Jobs sendet, die ein Signal an alle Prozesse in einer Prozessgruppe senden.

Charles Boyd
quelle
3
-1: ein Elternteil Töten tut nicht bewirken , dass die Kinder , getötet zu werden.
6.
2
Programme wie Shells erstellen neue Prozessgruppen und ordnen in der Regel verwandte untergeordnete Prozesse einer Gruppe zu. Jeder Job ist eine Prozessgruppe. Außerhalb des Kernels manipuliert eine Shell einen Job, indem sie mit dem Systemaufruf killpg Signale an die Prozessgruppe des Jobs sendet, die ein Signal an alle Prozesse in einer Prozessgruppe senden.
Charles Boyd
2
@CharlesBoyd Dieser Kommentar sollte Teil Ihrer Antwort sein.
Jordan
4
@CharlesBoyd: Füge das zu deiner Antwort hinzu und ich gebe dir +1 statt -1. Ihre Antwort lautet derzeit, als würden untergeordnete Prozesse beendet, wenn ein übergeordneter Prozess beendet wird (übrigens sitzungsbasiert, nicht prozessgruppenbasiert).
6.
@CharlesBoyd Ich verstehe das, aber der Punkt der Frage ist, wie es "einen Job manipuliert, indem es Signale sendet", wenn es ein SIGKILL empfängt. Ich sehe keine Möglichkeit, den killpgSystemaufruf zu diesem Zeitpunkt zu verwenden.
Kevin Cox
0

Erstens kann ich den Spieler nicht reproduzieren, der das getötete Terminal überlebt xterm.

Der Grund, warum es stirbt, ist, dass es einen SIGHUP vom Tod seiner Eltern bekommt.

Tumbleweed
quelle
Ich habe nie gesagt, dass es so ist, ich habe gesagt, dass es stirbt, aber es überlebt, wenn es in einem Drehbuch steht und das getötet wird.
Kevin Cox
Überlebt für mich kein Drehbuch.
Tumbleweed