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
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
Odpowiedzi:
Posługiwać się ps -o ppid=
ps -o ppid= 2072
zwraca 2061
, które można łatwo wykorzystać w skrypcie itp. ps -o ppid= -C foo
podaje PPID procesu za pomocą polecenia foo
. Można również użyć staroświecki ps | grep
: ps -eo ppid,comm | grep '[f]oo'
.ps -f 2072
zwraca
UID PID PPID C STIME TTY STAT TIME CMD izx 2072 2061 0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
pstree
Relacja jest: pstree -s -p 2072
:
init (1) ulpulseaudio (2061) ───gconf-helper (2072)
ppid=
ale przed pid wydaje się konieczna. Otrzymałem inne wyniki, jeśli je pominąłem.
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
$PPID
jest zdefiniowany przez powłokę, jest to PID procesu nadrzędnego/proc/
, masz kilka katalogów z PID każdego procesu. Następnie, jeśli chcesz cat /proc/$PPID/comm
, powtarzasz nazwę polecenia PIDPPID
zdefiniowany jako część standardu POSIX, więc każda powłoka zgodna z POSIX powinna to odpowiednio ustawić. Zobacz pubs.opengroup.org/onlinepubs/9699919799/utilities/…
pstree
według nazwy poleceniaZa pomocą tej opcji pstree
moż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 sleep
jest 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 cron
identyfikator procesu 795
. Prapradziadek ma również cron
identyfikator procesu 763
.
Jeśli chcesz wyszukiwać według identyfikatora procesu sleep
zamiast nazwy, możesz użyć:
$ pstree -hp | grep 14653
|-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)
Zauważ, że sleep
identyfikator procesu został zmieniony na 14653
. Nadrzędny (PID 841) śpi przez 1 minutę, budzi się na ułamek sekundy, a następnie uruchamia nowe sleep
polecenie, które otrzymuje nowy identyfikator procesu. Jest to kolejny powód, dla którego wyszukiwanie sleep
jest ł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).
807
lub cron
ta sama linia zostanie zrestartowana, a także więcej dzieci, jeśli zostaną odrodzone. Pytanie dotyczyło jednak znalezienia rodzica, a nie wszystkich dzieci.
1
. Nie sądzę, że możesz zabić PID 1.
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]
ps -o args ...
wyników, ale to ma trochę zapachu.