Jak uzyskać nadrzędny PID danego procesu w GNU / Linux z wiersza poleceń?

90

Rozwiązane przed zapytaniem: cat /proc/1111/status | grep PPid

Vi.
źródło
szybciej: grep PPid status |cut -f2jak w time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); zastanawiam się, czy jest coś jeszcze szybszego?
Aquarius Power
1
@AquariusPower Ponieważ pytasz, fgrep jest szybszy niż grep. fgrep PPid status |cut -f2
jbo5112
sed jest znacznie szybszy niż grep i cięty:sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

Odpowiedzi:

107

Wiersz poleceń:

ps -o ppid= -p 1111

Funkcjonować:

ppid () { ps -p ${1:-$$} -o ppid=; }

Alias ​​( preferowana jest funkcja ):

alias ppid='ps -o ppid= -p'

Scenariusz:

#!/bin/sh
pid=$1
if [ -z $pid ]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

Jeśli do funkcji lub skryptu nie zostanie podany PID, domyślnie wyświetlają PPID bieżącego procesu.

Aby użyć aliasu, należy podać PID.

Dennis Williamson
źródło
=Znak nie jest konieczne, przynajmniej na OS X 10.8.2.
jtbandes
5
@jtbandes: Używany tutaj znak równości tłumi wyjście linii nagłówka ( Linux i OS X ).
Dennis Williamson
13

To jedna z tych rzeczy, których się uczę, zapominam, uczę się, powtarzam. Ale to jest przydatne. Flaga „p” polecenia pstree pokazuje drzewo z liściem w N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
użytkownik194394
źródło
12

Pid nadrzędny znajduje się w zmiennej PPID powłoki, więc

echo $PPID
Ivan Novotny
źródło
1
Tak, ale 1. Chcę rodzic pid innego procesu, 2. Chcę mieć możliwość przejścia wszystkich przodków do inicjacji.
Vi.
1
Z drugiej strony, użycie $PPIDrozwiązało właśnie problem, na który Google zasugerowało tę stronę jako odpowiedź.
Paul Whittaker,
12

Aby wydrukować nadrzędny identyfikator ( PPID) wszystkich procesów, użyj tego polecenia:

ps j

Dla jednego procesu, po prostu przekazać PID, jak: ps j 1234.

Aby wyodrębnić tylko wartość, filtruj dane wyjściowe według awk:

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

Aby wyświetlić listę PID wszystkich rodziców, użyj pstree(zainstaluj, jeśli go nie masz):

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

Aby uzyskać nadrzędny identyfikator PID bieżącego procesu, użyj echo $$.

kenorb
źródło
1
pstreejest najmilszy, jaki tu widziałem.
sudo
ps jjest świetny, ponieważ jest dostępny na wielu dystrybucjach i łatwo go skomponować
Connor McCormick
6

Odczyt / proc / $ PID / status. Może być łatwo skrypty:

#! / bin / sh
P = 1 USD
jeśli [-z "$ P"]; następnie
    przeczytaj P.
fi
cat / proc / "$ P" / status | grep PPid: | grep -o „[0-9] *”
Vi.
źródło
2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'to wszystko czego potrzebujesz. (Jest to bardzo rzadkie w przypadku narzędzi uniksowych if [ -z ]; then read.)
grawity
@grawity Pomaga robić rzeczy takie jakecho $$ | ppid | ppid | ppid
Vi.
2
UUOC bezużyteczne użycie kota
Felipe Alvarez
@FelipeAlvarez, Moje dłonie nie są używane do pisania < /some/file grep | grep | ....
Vi.
2
Co powiesz nagrep /some/file
Felipe Alvarez
4

W systemie Linux:

ps hoppid $thatprocess
jthill
źródło
2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Nieco bardziej złożony przykład, który sprawdza polecenie rodzica, który rozpoczął bieżący proces Zmień comm = na cmd =, aby zobaczyć pełne polecenie

sebastian_t
źródło
Bezużyteczne użycie echa ? ;)
bobbogo,
Jest to faktycznie wymagane na niektórych terminalach. Szczerze mówiąc, nie pamiętam dokładnie, ale to faktycznie rozwiązało problem. : D
sebastian_t
1

Oto szybkie rozwiązanie, które powinno również działać:

ps $$
Gevork Palyan
źródło
To nie daje PID-owi, o który prosił PO.
Dennis Williamson
1

Uruchom topz dowolnymi opcjami, jak chcesz -u username and -p PID.

I podczas toppracy naciśnij f, pokazuje listę opcji, które chcesz wyświetlić w topdanych wyjściowych, a wyświetlane parametry będą wyświetlane dużymi literami, a parametry, które nie są wyświetlane, zostaną wyświetlone małymi literami.

Więc wpisując literę przed parametrem, możesz ją włączyć lub wyłączyć. W przypadku identyfikatora procesu nadrzędnego należy wprowadzić, ba następnie nacisnąć Enter, wyświetli on PPID w górnym pliku wyjściowym.

Praveen S.
źródło
1
Należy go stosować nieinteraktywnie. Wiem już, że htopmożesz skonfigurować PPIDkolumnę.
Vi.