Jak uzyskać PID rodzica danego procesu w systemie GNU/Linux z linii poleceń?
Rozwiązane przed zapytaniem: cat /proc/1111/status | grep PPid
Rozwiązane przed zapytaniem: cat /proc/1111/status | grep PPid
Wiersz poleceń:
ps -o ppid= -p 1111
Funkcja:
ppid () { ps -p ${1:-$$} -o ppid=; }
Alias (funkcja jest preferable ):
alias ppid='ps -o ppid= -p'
Skrypt:
#!/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 podano PID, domyślnie pokazuje on PPID bieżącego procesu.
Aby użyć aliasu, należy podać PID.
To jedna z tych rzeczy, których się uczę, zapominam, uwalniam, powtarzam. Ale to jest użyteczne. Flaga ‘s komendy pstree’ pokazuje drzewo z liściem na N:
pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
Parent pid jest w zmiennej powłoki PPID, więc
echo $PPID
Aby wydrukować ids rodzicielski (PPID
) wszystkich procesów, użyj tej komendy:
ps j
Dla pojedynczego procesu, wystarczy podać PID, jak: ps j 1234
.
Aby wyodrębnić tylko wartość, filtruj wyjście przez awk
, jak:
ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps
Aby wyświetlić listę PID-ów wszystkich procesów, użyj pstree
(zainstaluj go, jeśli go nie masz):
$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)
Aby uzyskać PID-y rodzicielskie bieżącego procesu, użyj echo $$
.
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
tmux
Trochę bardziej złożony przykład, który sprawdza polecenie rodzica, który rozpoczął bieżący proces Zmień komendę comm= na cmd= aby zobaczyć pełne polecenie
Uruchom top
z dowolnymi opcjami, jak -u username and -p PID
.
Podczas pracy top
naciśnij f, wyświetli się lista opcji, które chcesz wyświetlić na wyjściu top
, a wyświetlane parametry będą wyświetlane małymi literami, a parametry, które lub nie będą wyświetlane, będą wyświetlane małymi literami.
Zatem wpisując literę przed parametrem możesz ją włączyć lub wyłączyć. Dla ID procesu nadrzędnego należy wpisać b, a następnie nacisnąć Enter, spowoduje to wyświetlenie PPID na wyjściu górnym.
Oto szybkie rozwiązanie, które również powinno zadziałać:
ps $$
I came here when I was trying to find “all parent processes of a pid” Skończyłam robiąc własną funkcję rekurencyjną.
#!/bin/bash -eu
main(){
ps -p ${1:-$$} -h -o pid,ppid,args | \
(
read pid ppid args
echo -e "$pid\t$args"
[[$pid -gt 1]] && main $ppid
)
}
main "$@"