Was macht Kill 0 eigentlich? [geschlossen]


22

In der man pagesteht:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

Und so habe ich es in bash versucht:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Hier 0wird als verwendet pid. Wie ich verstanden habe, kill 0werden alle Prozesse im aktuellen Prozess abgebrochen, einschließlich pid15247. In diesem Beispiel hat es jedoch nichts getan. Hat jemand Ideen, wie man es benutzt?


Es sendet ein SIGTERMan den Prozess, den es ausgeführt hat. Der manBefehl hat beschlossen, ihn zu ignorieren.
Jordan

5
@jordanm, nein. Ein Job, der von einer interaktiven Shell gestartet wird, hat eine andere Prozessgruppe als die Shell. So kann die Shell sie in den Vordergrund und in den Hintergrund setzen. Siehe ps -j, um die Prozessgruppen anzuzeigen.
Stéphane Chazelas

1
Diese Frage ist eigentlich eine Kopie von SuperUser Frage Was macht Kill 0 eigentlich? (die von StackOverflow migriert wurde). Siehe auch Fragen zu kill -0(Anmerkung des Bindestrich), das ein anderes Thema ist, bei Stackoverflow und hier auf Unix.SE .
Adam Katz

Antworten:


27

Wie es heißt, sendet es das Signal an alle Mitglieder der Prozessgruppe des Anrufers.

Prozessgruppen werden verwendet, um die Jobsteuerung in der Shell zu implementieren (sie können für andere Zwecke verwendet werden, aber die interaktive Jobsteuerung der Shell ist der Hauptgrund für ihre Existenz).

Sie werden feststellen, dass bei der Eingabe Ctrl-Calle Prozesse der aktuellen Jobs abgebrochen werden, nicht nur derjenige, der sie gestartet hat. Außerdem werden die Hintergrundjobs dadurch nicht beendet.

Dies wird mit Prozessgruppen erreicht. Ein Job ist eine Gruppe von Prozessen, die von einer Shell gestartet werden, die die Shell in den Hintergrund oder in den Vordergrund stellen (als Vordergrundprozessgruppe des Terminals festlegen oder nicht) und als Ganzes beenden kann.

Informationen zu Prozessgruppen-IDs und Sitzungs-IDs erhalten Sie mit ps -j( jzur JKontrolle).

So beenden $xSie die Prozessgruppe der PGID :

kill -- "-$x"

kill 0 bricht die Prozessgruppe des Anrufers ab.

Beachten Sie /bin/kill 0, dass die Shell in diesem Fall einen neuen Job startet, um diesen killBefehl auszuführen , sodass sie killsich nur selbst beendet.

killist normalerweise eine eingebaute Shell, daher killwird die Prozessgruppe der Shell abgebrochen .

Wenn die Shell interaktiv ist, handelt es sich jedoch um die Prozessverwaltungsprozessgruppen. In der Regel befindet sich also kein anderer Prozess in der Prozessgruppe der Shell. Alle von der Shell gestarteten Prozesse befinden sich in anderen Prozessgruppen:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Oben sleepund psin zwei verschiedenen Prozessgruppen, eine im Hintergrund und eine im Vordergrund, und sie unterscheiden sich von der Prozessgruppe der Shell.

Sie könnten aber tun:

(man kill & sleep 1; ps -j; kill 0)

Die interaktive Shell würde eine neue Prozessgruppe für diese Subshell starten, und sowohl die Subshell als auch man (und die anderen von man gestarteten Befehle wie Ihr Pager, groff ...) würden sich in derselben Prozessgruppe befinden, also kill 0dort arbeiten. (Das sleepobige soll genügend Zeit geben, damit der Pager gestartet werden kann, damit wir ihn in der ps -jAusgabe sehen können, bevor wir ihn beenden).


kill -- -$xEigentlich heißt es bash: kill: (-63531) - No such processin Bash 5.0.11 (1) -Release auf MacOS 10.14, aber es ist sicher, dass Prozess existiert und läuft. pkill -Pfunktioniert gut
kyb

1
@kyb $ x muss eine Prozessgruppen-ID sein, keine Prozess-ID. ps -jInformieren Sie sich in der Ausgabe von über pgids
Stéphane Chazelas,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.