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?