GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist die PGID der untergeordneten Prozesse nicht die PGID des übergeordneten Prozesses?

Also lese ich immer wieder überall, dass dieser Befehl alle Kindprozesse des Elternprozesses beenden soll:

kill -- -$$

Die Verwendung einer negativen ID mit dem Kill-Befehl verweist auf eine PGID, und aus den Beispielen, die ich gesehen habe, scheint es, dass die PGID von untergeordneten Prozessen die PID des übergeordneten Prozesses sein sollte, aber auf meinem System ist dies nicht der Fall.

Auf meinem System ist die PGID des untergeordneten Skripts dieselbe wie die PGID des übergeordneten Skripts, das sich als bash herausstellt.

Was ist denn hier los? Waren die Beispiele falsch oder ist mein System anders aufgebaut?

Was ich erreichen muss, ist, untergeordnete Prozesse zu beenden, ohne den übergeordneten Prozess zu beenden, sodass ich kein Kill-Signal an die PGID senden möchte, in der sich der übergeordnete Prozess befindet.

Akzeptierte Antwort:

Wenn ein Prozess gegabelt wird, erbt er seine PGID von seinem übergeordneten Prozess. Die PGID ändert sich, wenn ein Prozess zum Prozessgruppenleiter wird , dann wird seine PGID von seiner PID kopiert. Von da an erben die neuen untergeordneten Prozesse, die sie erzeugen, und ihre Nachkommen diese PGID (es sei denn, sie starten eigene neue Prozessgruppen).

In einer Shell mit Jobsteuerung, wie den meisten interaktiven Shells, wird jeder Job in seine eigene Prozessgruppe gestellt. Wenn Sie ein Shell-Skript ausführen, ist der Shell-Prozess, der das Skript ausführt, der Gruppenleiter, und die PGID entspricht seiner PID.

In einer Shell ohne Jobsteuerung, wie die meisten Shells, die zum Ausführen von Skripten verwendet werden, werden Befehle in der Prozessgruppe der Shell ausgeführt.

Die Syntax kill -- -N tötet alle Prozesse in der Gruppe mit PGID =N. Sie können es nicht mit einer beliebigen PID verwenden, sondern nur mit der PID eines Prozessgruppenleiters, da dies die PGID ist. So funktioniert die Shell im Wesentlichen

kill %jobid

Syntax funktioniert – sie übersetzt intern %jobid an die PGID des Jobs und sendet das Signal an diese PGID.

Es gibt keine einfache Möglichkeit, ein Skript in einer eigenen Prozessgruppe von einem anderen Shell-Skript aus auszuführen. Siehe Wie man eine Prozessgruppe eines Shell-Skripts festlegt für einige Vorschläge.

Verwandte:Verschieben Sie Dateien aus mehreren Ordnern alle in das übergeordnete Verzeichnis mit der Eingabeaufforderung?
Linux
  1. Container von Hand bauen:Der PID-Namespace

  2. Neuer übergeordneter Prozess, wenn der übergeordnete Prozess stirbt?

  3. Warum ist der Standardprozesserstellungsmechanismus Fork?

  4. Warum funktioniert das Parent Shell Here-Dokument nicht für Unterbefehle in Dash, aber Bash funktioniert?

  5. Linux – Wie übergibt Node.js / das Clustermodul neue Verbindungen vom Master- / Elternprozess an untergeordnete Prozesse?

Warum nicht Softwarepakete aus dem Internet installieren

So senden Sie Prozesse unter Linux an den Hintergrund

Der untergeordnete Prozess empfängt das SIGINT des übergeordneten Prozesses

Wie bekomme ich die Prozess-ID, um einen Nohup-Prozess zu beenden?

Bash:Warum wird das übergeordnete Skript nicht bei SIGINT beendet, wenn das untergeordnete Skript SIGINT abfängt?

Warum kann ich diesen Prozess unter Linux nicht beenden?