Warum gibt es keine einfache Möglichkeit, alle Prozesse in einer bestimmten Prozessgruppe aufzulisten?

9

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.

yshui
quelle
1
Die PPID ist eine direkte Beziehung. Ich verstehe dein Problem nicht.
Julie Pelletier
Sie müssen den gesamten Prozess durchlaufen, um den
untergeordneten
1
Es dauert offensichtlich viel länger, sich darüber Gedanken zu machen, als es sogar Ihr Computer braucht, um es zu verarbeiten.
Julie Pelletier
2
Ihre Frage basiert auf einer falschen Prämisse. kill 0Es handelt sich nicht um untergeordnete oder übergeordnete PIDs, sondern um die Prozessgruppe.
Patrick
@ JuliePelletier Dein Argument macht keinen Sinn. Derzeit müssen Sie Tausende von Systemaufrufen mit potenziellen Rennbedingungen durchführen, um Informationen zu erhalten, die im Kernel verfügbar sind.
Yshui

Antworten:

7

Sie können alle Prozesse in einer bestimmten Gruppe auflisten, indem Sie die Ausgabe von filtern ps.

ps -e -o pgid,pid | awk -v p=1234 '$1 == p {print $2}'

Es gibt keine psMöglichkeit, direkt nach PGID zu filtern, wahrscheinlich weil es nicht sehr oft nützlich ist.

Was psunter 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.

Gilles 'SO - hör auf böse zu sein'
quelle
Wechseln Sie zu "ps -eo pid, pgid", um alle Prozesse auf dem System abzurufen, nicht nur die aktuelle Sitzung.
Todd befreit
Ändern Sie, ps -e -o pgid,pid | awk -v p=1234 '$1 == p {print $2}'um das richtige Ergebnis zu erhalten - die Spaltenreihenfolge in der psAusgabe, die von der ursprünglichen Antwort erzeugt wurde, ist falsch.
Sergei Nikiforov
7

Über die Befehlszeile unter Linux kann man pgrepvon procps-ng mit dem Flag --pgroup(oder -g) verwenden.

mattdm
quelle
3

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)(oder kill -- -PGIDin der Shell) signalisiert werden, wobei PGIDsich die Prozessgruppen-ID befindet.

Die Prozessgruppe einer PID wird von der getpgid()Funktion zurückgegeben, und die Prozessgruppe des aktuellen Prozesses kann mit gefunden werden getpgrp().

In der Shell können Sie verwenden

$ ps -opid,pgid,command

um die PID, PGID (Prozessgruppen-ID) und Befehlszeile Ihrer aktuellen Sitzung abzurufen.

Dies kann so etwas wie zurückgeben

  PID  PGID COMMAND
20716 20716 -ksh93 (ksh93)
83662 83662 -ksh93 (ksh93)
 4322  4322 /usr/X11R6/bin/xclock
 5374  5374 tmux: client (/tmp/tmux-11000/default) (tmux)
78747 78747 -ksh93 (ksh93)
29298 29298 ps -opid
63563 63563 -ksh93 (ksh93)
63327 63327 mutt
21790 21790 -ksh93 (ksh93)
64493 64493 /bin/sh /usr/X11R6/bin/startx
14485 64493 xinit /home/kk/.xinitrc -- /usr/X11R6/bin/X :0 -auth /home/kk/.serverauth.E3cwuT5FZR
93531 93531 sh /home/kk/.xinitrc
48598 93531 flwm
28154 93531 xterm
73053 93531 xterm

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.

Kusalananda
quelle
Ich weiß das schon, das habe ich nicht gefragt.
Yshui
2
@yshui Ich habe meine Antwort aktualisiert. Es wäre außerdem interessant zu wissen, welches spezifische Problem Sie lösen möchten.
Kusalananda