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

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

Daher lese ich ü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, geht hervor, dass die PGID untergeordneter Prozesse die PID des übergeordneten Prozesses sein sollte, was auf meinem System jedoch nicht der Fall ist.

Auf meinem System ist die PGID des untergeordneten Elements dieselbe wie die PGID des übergeordneten Skripts, bei dem es sich um Bash handelt.

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

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

Antwort1

Wenn ein Prozess geforkt wird, erbt er seine PGID von seinem übergeordneten Prozess. Die PGID ändert sich, wenn ein Prozess einProzessgruppenleiter, dann wird seine PGID von seiner PID kopiert. Von da an erben die neuen Kindprozesse, die es erzeugt, und deren Nachkommen diese PGID (es sei denn, sie beginnen eigene neue Prozessgruppen).

In einer Shell mit Jobsteuerung, wie den meisten interaktiven Shells, wird jeder Job einer eigenen Prozessgruppe zugeordnet. 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 beispielsweise den meisten Shells zum Ausführen von Skripts, werden Befehle in der Prozessgruppe der Shell ausgeführt.

Die Syntax kill -- -Nbeendet alle Prozesse in der Gruppe mit PGID = N. Sie können sie nicht mit einer beliebigen PID verwenden, sondern nur mit der PID eines Prozessgruppenleiters, da dies die PGID ist. Dies ist im Wesentlichen die Vorgehensweise der Shell

kill %jobid

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

Es gibt keine einfache Möglichkeit, ein Skript in seiner eigenen Prozessgruppe von einem anderen Shell-Skript aus auszuführen. SieheSo legen Sie die Prozessgruppe eines Shell-Skripts festfür einige Vorschläge jedoch.

verwandte Informationen