Como obter o PID pai de um determinado processo no GNU / Linux na linha de comando?


90

Resolvido antes de ser perguntado: cat /proc/1111/status | grep PPid


mais rápido: grep PPid status |cut -f2como em time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); pergunto se há algo ainda mais rápido?
Aquarius Power

1
@AquariusPower Como você pergunta, o fgrep é mais rápido que o grep. fgrep PPid status |cut -f2
jbo5112

O sed é muito mais rápido que o grep and cut: #sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

Respostas:


108

Linha de comando:

ps -o ppid= -p 1111

Função:

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

Alias ​​(uma função é preferível ):

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

Roteiro:

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

Se nenhum PID for fornecido para a função ou o script, eles serão padrão para mostrar o PPID do processo atual.

Para usar o alias, um PID deve ser fornecido.


O =sinal não é necessário, pelo menos no OS X 10.8.2.
jtbandes

5
@jtbandes: O sinal de igual conforme usado aqui suprime a saída da linha de cabeçalho ( Linux e OS X ).
Dennis Williamson

13

Essa é uma daquelas coisas que eu aprendo, esqueço, reaprendo, repito. Mas é útil. A bandeira do comando pstree mostra uma árvore com uma folha em N:

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

12

O pid pai está na variável PPID do shell, então

echo $PPID

1
Sim, mas 1. Quero o pai pid de outro processo, 2. Quero poder atravessar todos os ancestrais para iniciar.
Vi.

1
Por outro lado, o uso $PPIDacabou de resolver o problema para o qual o Google sugeriu esta página como resposta.
Paul Whittaker

12

Para imprimir os IDs pai ( PPID) de todos os processos, use este comando:

ps j

Para o único processo, basta passar o PID, como: ps j 1234.

Para extrair apenas o valor, filtre a saída por awk, como:

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

Para listar PIDs de todos os pais, use pstree(instale-o se não o tiver):

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

Para obter o PID pai do processo atual, use echo $$.


1
pstreeé o mais legal que eu já vi aqui.
sudo

ps jé ótimo porque está disponível em muitas distros e é facilmente comporável
Connor McCormick

6

Leia / proc / $ PID / status. Pode ser facilmente script:

#! / bin / sh
P = $ 1
se [-z "$ P"]; então
    leia P
fi
cat / proc / "$ P" / status | grep PPid: | grep -o "[0-9] *"

2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'é tudo o que você precisa. (É muito raro para obter ferramentas Unix para fazer a if [ -z ]; then readcoisa.)
grawity

@rawity Ajuda a fazer coisas comoecho $$ | ppid | ppid | ppid
Vi.

2
Uso inútil de gato UUOC
Felipe Alvarez

@FelipeAlvarez, Minhas mãos não estão acostumadas a digitar < /some/file grep | grep | ....
Vi.

2
Que talgrep /some/file
Felipe Alvarez


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

Um exemplo um pouco mais complexo que verifica o comando de um pai que iniciou o processo atual Altere comm = para cmd = para ver o comando completo


Uso inútil de eco ? ;)
bobbogo 12/12

Na verdade, é necessário em alguns terminais. Para ser sincero, não me lembro exatamente, mas na verdade resolveu um problema. : D
sebastian_t


1

Corra topcom as opções que desejar, como -u username and -p PID.

Enquanto toppressiona f, ele mostra uma lista de opções que você deseja exibir na topsaída, e os parâmetros exibidos serão mostrados em letras maiúsculas e os parâmetros que serão exibidos ou não serão mostrados em letras minúsculas.

Portanto, digitando a letra antes do parâmetro, você pode habilitá-lo ou desabilitá-lo. Para o ID do processo pai, você deve digitar be pressionar Enter, ele exibirá o PPID na saída superior.


1
É para ser usado de forma não interativa. Eu já sei que em htopvocê pode configurar a PPIDcoluna.
Vi.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.