2010-06-08 09:42:29 +0000 2010-06-08 09:42:29 +0000
94
94
Advertisement

Jak uzyskać PID rodzica danego procesu w systemie GNU/Linux z linii poleceń?

Advertisement

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

Advertisement
Advertisement

Odpowiedzi (10)

112
112
112
2010-06-08 11:21:06 +0000

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.

15
15
15
2013-01-31 20:32:13 +0000

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
13
Advertisement
13
13
2012-09-24 11:55:28 +0000
Advertisement

Parent pid jest w zmiennej powłoki PPID, więc

echo $PPID
12
12
12
2016-02-19 21:31:34 +0000

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 $$.

6
Advertisement
6
6
2010-06-08 09:44:05 +0000
Advertisement

Przeczytaj /proc/$PID/status. Może być łatwo skryptowane:

#!/bin/sh P=$1 if [-z "$P"]; then read P fi cat /proc/"$P"/status | grep PPid: | grep -o "[0-9]\*"
4
4
4
2014-10-21 17:30:05 +0000

Na Linuksie:

ps hoppid $thatprocess
2
Advertisement
2
2
2014-10-19 20:08:11 +0000
Advertisement
$ 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

1
1
1
2012-11-23 12:21:12 +0000

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.

1
Advertisement
1
1
2013-09-12 06:18:04 +0000
Advertisement

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

ps $$
0
0
0
2019-10-30 21:51:11 +0000

all parent processes of a pid

I came here when I was trying to find “all parent processes of a pid” Skończyłam robiąc własną funkcję rekurencyjną.

pid\_lineage.sh

#!/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 "$@"
Advertisement

Pytania pokrewne

6
10
10
7
3
Advertisement
Advertisement