Wie erhalte ich die übergeordnete Prozess-ID eines bestimmten untergeordneten Prozesses?

49

Wie bekomme ich eine Eltern-PID von einer bestimmten Kinder-PID?

Ich weiß, dass ich es unter / proc vollständig überprüfen kann. Ich frage mich, ob es einen cleveren / besseren Weg gibt, dies in Ubuntu zu erreichen. Beachten Sie, dass die Eltern möglicherweise getötet werden oder nicht.

Vielen Dank

Zwischenspeicher
quelle

Antworten:

58

So erhalten Sie eine übergeordnete PID (PPID) aus der Prozess-ID (PID) eines Kindes mithilfe der Befehlszeile

Verwenden ps -o ppid=

  • ZB gibt ps -o ppid= 2072Returns 2061, die Sie einfach in einem Skript verwenden können, ps -o ppid= -C foodie PPID von process with command aus foo. Sie können auch das Altmodische verwenden ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Vollständigere Erklärung: ps -f 2072kehrt zurück
    UID PID   PPID   C STIME TTY STAT TIME CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helfer
    
  • Die pstreeBeziehung ist pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-helfer (2072)
    
ish
quelle
Kennen Sie eine Möglichkeit, mit pstree Aufrufe (Befehl + Argumente) anzuzeigen, ohne Zeilen zu teilen? Meine Installation teilt automatisch Zeilen, wenn ich Argumente hinzufüge, auch wenn das Ergebnis leicht in eine Zeile passen könnte. Die Manpage scheint das zu sagen, gibt aber keinen Grund an. Meine Problemumgehung besteht darin, PIDs aus pstree zu extrahieren und ps -o args ...die Ergebnisse zu nutzen, aber das riecht ein bisschen.
John P
Nur etwas, das mich überrascht hat: Der Raum nach, ppid= aber vor dem PID scheint notwendig zu sein. Ich habe unterschiedliche Ergebnisse erhalten, wenn ich es weggelassen habe.
Gregory Arenius
8

Verwenden Sie nur die Variable, um die übergeordnete PID zu erhalten:

echo $PPID

Wenn Sie den Befehl von dieser übergeordneten PID benötigen:

cat /proc/$PPID/comm

Wenn Sie die vollständige Befehlszeile benötigen (mit allen Optionen):

cat /proc/$PPID/cmdline

Erläuterung

  • $PPID Wird von der Shell definiert, ist es die PID des übergeordneten Prozesses
  • In /proc/haben Sie einige Verzeichnisse mit der PID der einzelnen Prozesse. Wenn Sie dies tun cat /proc/$PPID/comm, geben Sie den Befehlsnamen der PID wieder

Check man proc

Gilles Quenot
quelle
1
Das ist die beste Antwort. procfs ist eine Kernel-API. Führen Sie einen Befehl aus und analysieren Sie die Ausgabe als Unsinn.
Massimo
Dies ist möglicherweise auch die portabelste, PPIDdie als Teil des POSIX-Standards definiert ist. Daher sollte jede POSIX-kompatible Shell dies entsprechend einstellen. Siehe pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Verwendung pstreenach Befehlsname

Mithilfe von können pstreeSie nach dem Namen des untergeordneten Prozesses suchen und die Prozess-ID (PID) zusammen mit den Eltern, Großeltern und allen untergeordneten Elementen des untergeordneten Prozesses abrufen:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

In diesem Fall sleepist der untergeordnete Befehl und es ist PID 8414. Die Eltern-ID lautet 841 und heißt display-auto-brightness. Der Großelternteil ist eine Shell ( sh) mit einer Prozess-ID von 839. Der Urgroßvater hat croneine Prozess-ID von 795. Die Ur-Ur-Großeltern haben auch croneine Prozess-ID von 763.

Wenn Sie nach der Prozess-ID sleepanstelle des Namens suchen möchten, können Sie Folgendes verwenden:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

Beachten Sie, dass die sleepProzess-ID in geändert wurde 14653. Das übergeordnete Element (PID 841) schläft 1 Minute lang, wacht für einen Sekundenbruchteil auf und startet dann einen neuen sleepBefehl, der eine neue Prozess-ID erhält. Dies ist ein weiterer Grund, warum das Suchen sleepeinfacher ist als das Suchen nach Prozess-ID.

Dieser Code stammt aus: Automatische Anpassung der Anzeigehelligkeit basierend auf Sonnenaufgang und Sonnenuntergang und Anpassung an diese Frage.


Verwenden Sie die PID anstelle des Namens, um eine verschachtelte Kette bis zum Startvorgang anzuzeigen:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Hinweis: Eine weitere Minute ist vergangen und der Befehl sleep erhält eine neue PID (8541).

WinEunuuchs2Unix
quelle
In Ihrem Beispiel hätte diese Methode für den Cron-Prozess mit PID 807 nicht funktioniert.
Olorin
@Olorin In beiden Beispielen könnten Sie nach 807oder crongreifen, und die gleiche Zeile würde nachgestimmt werden, ebenso wie mehr Kinder, wenn sie erzeugt werden. Aber es ging darum, die Eltern zu finden, nicht alle Kinder.
WinEunuuchs2Unix
Genau - wie finden Sie das übergeordnete Element von PID 807 mit diesem Ausgang? Sie können nicht, weil es nicht die Eltern von 807 enthalten.
Olorin
@Olorin Das übergeordnete Element von cron ist systemd (PID) 1. Ich glaube nicht, dass Sie PID 1 töten können.
WinEunuuchs2Unix
Ich habe nichts darüber gesagt, etwas zu töten. Um dies zu verdeutlichen, behaupten Sie jetzt, dass die erste Zeile von pstree oder das Greifen nach dem Befehlsnamen immer die übergeordnete PID ergibt?
Olorin
0

ps -efj kann auch für die gleichen verwendet werden.

Zum Beispiel,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
Obi Wan - PallavJha
quelle