Come ottenere il PID genitore di un determinato processo in GNU / Linux dalla riga di comando?


90

Risolto prima chiesto: cat /proc/1111/status | grep PPid


più veloce: grep PPid status |cut -f2come in time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); chiedo se c'è qualcosa di ancora più veloce?
Aquarius Power

1
@AquariusPower Da quando chiedi, fgrep è più veloce di grep. fgrep PPid status |cut -f2
jbo5112,

sed è molto più veloce di grep e cut:sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian,

Risposte:


108

Riga di comando:

ps -o ppid= -p 1111

Funzione:

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

Alias ​​(è preferibile una funzione ):

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

script:

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

Se non viene fornito alcun PID alla funzione o allo script, per impostazione predefinita vengono visualizzati i PPID del processo corrente.

Per utilizzare l'alias, è necessario fornire un PID.


Il =segno non è necessario, almeno su OS X 10.8.2.
jtbandes

5
@jtbandes: il segno uguale usato qui sopprime l'output della riga di intestazione ( Linux e OS X ).
Dennis Williamson,

13

Questa è una di quelle cose che imparo, dimentico, riapprendo, ripeto. Ma è utile La bandiera del comando pstree mostra un albero con una foglia in corrispondenza di N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks

12

Il pid padre è nella variabile shell PPID, quindi

echo $PPID

1
Sì, ma 1. Voglio un genitore pid di altri processi, 2. Voglio essere in grado di attraversare tutti gli antenati per init.
Vi.

1
D'altro canto, l'utilizzo $PPIDha risolto il problema che Google ha suggerito a questa pagina come risposta.
Paul Whittaker,

12

Per stampare gli ID parent ( PPID) di tutti i processi, utilizzare questo comando:

ps j

Per il singolo processo, basta passare il PID, come: ps j 1234.

Per estrarre solo il valore, filtra l'output per awk, come:

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

Per elencare i PID di tutti i genitori, usa pstree(installalo se non lo hai):

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

Per ottenere il PID principale del processo corrente, utilizzare echo $$.


1
pstreeè il più bello che abbia mai visto qui.
sudo,

ps jè fantastico perché è disponibile su molte distro ed è facilmente componibile
Connor McCormick il

6

Leggi / proc / $ PID / stato. Può essere facilmente scritto:

#! / Bin / sh
P = $ 1
se [-z "$ P"]; poi
    leggi P
fi
cat / proc / "$ P" / status | grep PPid: | grep -o "[0-9] *"

2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'é tutto quello di cui hai bisogno. (È molto raro che gli strumenti Unix facciano la if [ -z ]; then readcosa.)
Grawity

@grawity Aiuta a fare cose comeecho $$ | ppid | ppid | ppid
Vi.

2
UUOC uso inutile del gatto
Felipe Alvarez,

@FelipeAlvarez, Le mie mani non sono usate per scrivere < /some/file grep | grep | ....
Vi.

2
Che diregrep /some/file
Felipe Alvarez,


2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Un esempio un po 'più complesso che controlla il comando di un genitore che ha avviato il processo corrente Cambia comm = in cmd = per vedere il comando completo


Uso inutile dell'eco ? ;)
bobbogo,

In realtà è richiesto su alcuni terminali. Ad essere sincero, non ricordo esattamente ma in realtà ha risolto un problema. : D
sebastian_t,


1

Esegui topcon qualsiasi opzione tu voglia, come -u username and -p PID.

E mentre topè in funzione premere f, mostra un elenco di opzioni che si desidera visualizzare topnell'output, ei parametri visualizzati verranno mostrati in lettere MAIUSCOLE e i parametri che verranno visualizzati o meno in lettere minuscole.

Quindi inserendo la lettera prima del parametro è possibile abilitarla o disabilitarla. Per l'ID del processo principale devi inserire be poi premere Enter, visualizzerà il PPID nell'output principale.


1
Deve essere usato in modo non interattivo. So già che in htopte puoi configurare la PPIDcolonna.
Vi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.