Jak uzyskać identyfikator procesu nadrzędnego danego procesu potomnego?

49

Jak uzyskać pid dla rodziców z pid dla dzieci?

Wiem, że mogę to sprawdzić ręcznie pod / proc. Zastanawiam się, czy istnieje sprytny / lepszy sposób na osiągnięcie tego w Ubuntu. Pamiętaj, że rodzic może, ale nie musi, zostać zabity.

Dzięki

Pamięć podręczna
źródło

Odpowiedzi:

58

Jak uzyskać nadrzędny PID (PPID) z identyfikatora procesu podrzędnego (PID) za pomocą wiersza polecenia

Posługiwać się ps -o ppid=

  • np. ps -o ppid= 2072zwraca 2061, które można łatwo wykorzystać w skrypcie itp. ps -o ppid= -C foopodaje PPID procesu za pomocą polecenia foo. Można również użyć staroświecki ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Pełniejsze wyjaśnienie: ps -f 2072zwraca
    UID PID   PPID   C STIME TTY STAT TIME CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • pstreeRelacja jest: pstree -s -p 2072:
    init (1) ulpulseaudio (2061) ───gconf-helper (2072)
    
ish
źródło
Czy znasz sposób na wywoływanie pstree (wywołanie + argumenty) bez podziału linii? Moja instalacja automatycznie dzieli linie, jeśli dodam argumenty, nawet jeśli wynik łatwo mieści się w jednej linii. Strona podręcznika wydaje się mówić tyle samo, ale nie podaje powodu. Moje obejście obejmuje wyodrębnienie PID z pstree i wykorzystanie ps -o args ...wyników, ale to ma trochę zapachu.
John P
Po prostu coś, co mnie zaskoczyło: przestrzeń po, ppid= ale przed pid wydaje się konieczna. Otrzymałem inne wyniki, jeśli je pominąłem.
Gregory Arenius
8

Używanie tylko zmiennej , aby uzyskać macierzysty PID:

echo $PPID

jeśli potrzebujesz polecenia z tego nadrzędnego pid:

cat /proc/$PPID/comm

jeśli potrzebujesz pełnego wiersza poleceń (ze wszystkimi opcjami):

cat /proc/$PPID/cmdline

Wyjaśnienie

  • $PPID jest zdefiniowany przez powłokę, jest to PID procesu nadrzędnego
  • za /proc/, masz kilka katalogów z PID każdego procesu. Następnie, jeśli chcesz cat /proc/$PPID/comm, powtarzasz nazwę polecenia PID

Sprawdź człowieka proc

Gilles Quenot
źródło
1
To najlepsza odpowiedź. procfs to interfejs API jądra. wykonać polecenie i przeanalizować, czy dane wyjściowe są nonsensowne.
Massimo
Jest to również potencjalnie najbardziej przenośny, PPIDzdefiniowany jako część standardu POSIX, więc każda powłoka zgodna z POSIX powinna to odpowiednio ustawić. Zobacz pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Używanie pstreewedług nazwy polecenia

Za pomocą tej opcji pstreemożesz wyszukiwać według nazwy procesu potomnego i uzyskać identyfikator procesu (PID) wraz z rodzicami, dziadkami i wszystkimi dziećmi procesu potomnego:

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

W tym przypadku sleepjest to polecenie potomne, a jego PID to 8414. Jego identyfikator nadrzędny to 841 i nazywa się display-auto-brightness. Dziadek jest powłoką ( sh) o identyfikatorze procesu 839. Pradziadek ma cronidentyfikator procesu 795. Prapradziadek ma również cronidentyfikator procesu 763.

Jeśli chcesz wyszukiwać według identyfikatora procesu sleepzamiast nazwy, możesz użyć:

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

Zauważ, że sleepidentyfikator procesu został zmieniony na 14653. Nadrzędny (PID 841) śpi przez 1 minutę, budzi się na ułamek sekundy, a następnie uruchamia nowe sleeppolecenie, które otrzymuje nowy identyfikator procesu. Jest to kolejny powód, dla którego wyszukiwanie sleepjest łatwiejsze niż wyszukiwanie według identyfikatora procesu.

Ten kod pochodzi z: Automatycznie dostosuj jasność wyświetlacza na podstawie wschodu i zachodu słońca i dostosował się do tego pytania.


Aby zobaczyć łańcuch zagnieżdżony od samego początku do procesu rozruchu, użyj PID zamiast nazwy:

$ 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

Uwaga: Minęła kolejna minuta, a polecenie uśpienia otrzymuje nowy PID (8541).

WinEunuuchs2Unix
źródło
W twoim przykładzie ta metoda nie zadziałałaby dla procesu cron z PID 807.
Olorin
@Olorin W obu przykładach możesz grepować na 807lub cronta sama linia zostanie zrestartowana, a także więcej dzieci, jeśli zostaną odrodzone. Pytanie dotyczyło jednak znalezienia rodzica, a nie wszystkich dzieci.
WinEunuuchs2Unix
Dokładnie - jak znaleźć element nadrzędny PID 807 z tym wyjściem? Nie możesz, bo nie obejmuje to rodzica 807.
Olorin
@Olorin Element nadrzędny crona jest systemd, czyli PID 1. Nie sądzę, że możesz zabić PID 1.
WinEunuuchs2Unix
Nie mówiłem nic o zabijaniu czegokolwiek. Żeby to wyjaśnić, teraz twierdzisz, że wzięcie pierwszego wiersza pstree lub grep dla nazwy polecenia zawsze da nadrzędny PID?
Olorin
0

ps -efj można również użyć do tego samego.

Na przykład,

> 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
źródło