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

Wie kann man die übergeordnete PID eines bestimmten Prozesses in GNU/Linux von der Kommandozeile aus erhalten?

Gelöst vor der Frage: cat /proc/1111/status | grep PPid

Antworten (10)

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

Befehlszeile:

ps -o ppid= -p 1111

Funktion:

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

Alias (eine Funktion ist vorzugsweise ):

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

Skript:

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

Wenn der Funktion oder dem Skript keine PID übergeben wird, zeigen sie standardmäßig die PPID des aktuellen Prozesses an.

Um den Alias zu verwenden, muss eine PID übergeben werden.

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

Das ist eines der Dinge, die ich lerne, vergesse, wiederlerne, wiederhole. Aber es ist nützlich. Das Flag ‘s’ des Befehls pstree zeigt einen Baum mit einem Blatt bei N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
13
13
13
2012-09-24 11:55:28 +0000

Die übergeordnete pid ist in der Shell-Variablen PPID, also

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

Um die übergeordneten IDs (PPID) aller Prozesse zu drucken, verwenden Sie diesen Befehl:

ps j

Für den einzelnen Prozess übergeben Sie einfach die PID, wie: ps j 1234.

Um nur den Wert zu extrahieren, filtern Sie die Ausgabe von awk, wie:

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

Um die PIDs aller übergeordneten Prozesse aufzulisten, verwenden Sie pstree (installieren Sie es, wenn Sie es nicht haben):

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

Um die übergeordnete PID des aktuellen Prozesses zu erhalten, verwenden Sie echo $$.

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

Lesen Sie /proc/$PID/status. Kann leicht skriptiert werden:

#!/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

Unter Linux:

ps hoppid $thatprocess
2
2
2
2014-10-19 20:08:11 +0000
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Ein etwas komplexeres Beispiel, das den Befehl eines Elternteils prüft, der den aktuellen Prozess gestartet hat Ändern Sie comm= in cmd=, um den vollständigen Befehl zu sehen

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

Führen Sie top mit den gewünschten Optionen aus, wie z.B. -u username and -p PID.

Und während top arbeitet, drücken Sie f, es zeigt eine Liste von Optionen, die Sie in der Ausgabe von top anzeigen möchten, und die angezeigten Parameter werden in GROSSBUCHSTABEN und die Parameter, die angezeigt oder nicht angezeigt werden, in Kleinbuchstaben angezeigt.

Durch Eingabe des Buchstabens vor dem Parameter können Sie ihn also aktivieren oder deaktivieren. Für die übergeordnete Prozess-ID müssen Sie b eingeben und dann Enter drücken, dann wird die PPID in der oberen Ausgabe angezeigt.

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

Hier ist eine schnelle Lösung, die auch funktionieren sollte:

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

all parent processes of a pid

Ich kam hierher, als ich versuchte, “all parent processes of a pid” zu finden. Es endete damit, dass ich meine eigene rekursive Funktion dafür erstellte.

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 "$@"

Verwandte Fragen

6
10
10
7
4