Um kill (0) effizient zu unterstützen, muss der Kernel die Prozesse in einer Prozessgruppe verfolgen. Diese Informationen werden jedoch in keiner Weise dem Benutzerbereich zugänglich gemacht. Um diese Informationen zu erhalten, müsste man den gesamten procfs-Baum durchlaufen und die pgid überprüfen.
Dies gilt für Linux, * BSD usw. Alle * nix-Systeme, die ich überprüft habe, haben dieses Problem. Warum sind sie so gestaltet?
BEARBEITEN : Ändern Sie die Frage so, dass das Beispiel kill (0) Sinn macht.
process
process-management
yshui
quelle
quelle
kill 0
Es handelt sich nicht um untergeordnete oder übergeordnete PIDs, sondern um die Prozessgruppe.Antworten:
Sie können alle Prozesse in einer bestimmten Gruppe auflisten, indem Sie die Ausgabe von filtern
ps
.Es gibt keine
ps
Möglichkeit, direkt nach PGID zu filtern, wahrscheinlich weil es nicht sehr oft nützlich ist.Was
ps
unter der Haube passiert, spielt eigentlich keine Rolle.Dies ist im Gegensatz zu nicht atomar
kill -- -1234
. Aber selbst wenn es eine Möglichkeit gäbe, Prozesse in einer Prozessgruppe atomar aufzulisten, was würde es nützen? Zum Zeitpunkt der Verarbeitung der Liste ist sie möglicherweise unvollständig oder enthält Prozesse, die tot sind und deren PID wiederverwendet wurde.Um mit den Prozessen in einer Prozessgruppe etwas Nützliches zu tun, müsste der Kernel eine Schnittstelle verfügbar machen, die die Aktion ausführt, und nicht nur eine Schnittstelle, die die Mitglieder der Gruppe auflistet. Die einzige solche Schnittstelle besteht darin, ein Signal an die Prozesse zu senden.
quelle
ps -e -o pgid,pid | awk -v p=1234 '$1 == p {print $2}'
um das richtige Ergebnis zu erhalten - die Spaltenreihenfolge in derps
Ausgabe, die von der ursprünglichen Antwort erzeugt wurde, ist falsch.Über die Befehlszeile unter Linux kann man
pgrep
von procps-ng mit dem Flag--pgroup
(oder-g
) verwenden.quelle
Beim Senden eines Signals an PID 0 (Null) wird das Signal an alle Prozesse geliefert, die Mitglieder derselben Prozessgruppe wie der Absender sind. Eine andere Prozessgruppe als die aktuelle kann mit
kill(-PGID)
(oderkill -- -PGID
in der Shell) signalisiert werden, wobeiPGID
sich die Prozessgruppen-ID befindet.Die Prozessgruppe einer PID wird von der
getpgid()
Funktion zurückgegeben, und die Prozessgruppe des aktuellen Prozesses kann mit gefunden werdengetpgrp()
.In der Shell können Sie verwenden
um die PID, PGID (Prozessgruppen-ID) und Befehlszeile Ihrer aktuellen Sitzung abzurufen.
Dies kann so etwas wie zurückgeben
Nach einer Klärung der Frage:
Der Zweck einer Prozessgruppe besteht darin, ein Signal an alle ihre Mitglieder senden zu können, ohne die Prozess-IDs jedes einzelnen Mitglieds zu kennen.
Ohne ein Prozessgruppenkonzept müsste man alle Prozesse auf dem System abrufen, herausfinden, wie sie zusammenhängen (unter Verwendung der übergeordneten Prozess-IDs) und die relevanten Prozesse durchlaufen und jeweils das Signal senden.
Der Kernel tut dies, aber er kennt und verfolgt Prozessgruppen, sodass er niemals alle Prozesse durchlaufen muss, um ein Signal an eine Prozessgruppe zu senden , sondern nur über die Mitglieder der Gruppe.
Da die Prozessgruppen-ID für den Benutzer verfügbar ist , muss nur ein Prozess nach seiner Prozessgruppen-ID abgefragt werden, bevor ein Signal an alle Prozesse in dieser Gruppe gesendet werden kann.
quelle