Warum verarbeitet die PGID meines Kindes nicht die PID des Elternteils?

13

Deshalb lese ich überall, dass dieser Befehl alle untergeordneten Prozesse des übergeordneten Prozesses beenden sollte:

kill -- -$$

Die Verwendung einer negativen ID mit dem Befehl kill verweist auf eine PGID. Aus den Beispielen geht hervor, dass die PGID von untergeordneten Prozessen die PID des übergeordneten Prozesses sein sollte, auf meinem System jedoch nicht.

Auf meinem System ist die PGID des Kindes die gleiche wie die PGID des übergeordneten Skripts, was sich als Bash herausstellt.

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

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

TCZ8
quelle

Antworten:

11

Ich denke, Sie meinen PGID, die für Prozessgruppen-ID steht .

Wenn ein Prozess gegabelt wird, erbt er seine PGID vom übergeordneten Prozess. Die PGID ändert sich, wenn ein Prozess eine wird Prozessgruppenleiter , dann seine PGID von seinem PID kopiert wird. Von da an verarbeitet das neue untergeordnete Element, dass es erzeugt, und seine Nachkommen erben diese PGID (es sei denn, sie starten eigene neue Prozessgruppen).

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

In einer Shell ohne Jobsteuerung, wie z. B. den meisten zum Ausführen von Skripten verwendeten Shells, werden Befehle in der Prozessgruppe der Shell ausgeführt.

Die Syntax beendet kill -- -Nalle Prozesse in der Gruppe mit PGID = N. Sie können sie nicht mit einer beliebigen PID verwenden, nur mit der PID eines Prozessgruppenleiters, da dies die PGID ist. Dies ist im Wesentlichen, wie die Schale ist

kill %jobid

Die 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 einer eigenen Prozessgruppe über ein anderes Shell-Skript auszuführen. Unter Festlegen der Prozessgruppe eines Shell-Skripts finden Sie jedoch einige Vorschläge.

Barmar
quelle
Wollen Sie damit sagen, dass eine Shell mit oder ohne Jobkontrolle dasselbe tut?
TCZ8
1
Nein. Eine Shell mit Jobsteuerung startet für jeden Job eine neue Prozessgruppe. Eine Shell ohne Jobsteuerung startet nicht für jeden Job eine neue Prozessgruppe, sondern führt sie in einer eigenen Prozessgruppe aus.
Barmar
wow .. das habe ich nicht gleich beim ersten mal richtig gelesen. Ich schätze, ich möchte die Job-Kontrolle einschalten? Würde das sicherstellen, dass die Kinder eine PGID haben, die mit der PID des übergeordneten Skripts übereinstimmt? Oder erhält jedes Kind eine eigene, eindeutige PGID?
TCZ8
Ich habe ein paar Online-Dokumente über Jobkontrollen gefunden, ich werde das durchgehen. Vielen Dank für Ihre Hilfe, Barmar.
TCZ8
1
Bei der Jobkontrolle erhält jedes Kind eine eigene PGID. Ohne Jobsteuerung erben sie die PGID des übergeordneten Elements. Das übergeordnete Element hat jedoch möglicherweise seine PGID von seinem übergeordneten Element geerbt , wenn es kein Prozessgruppenleiter ist.
Barmar