Como obtenho o ID do processo pai de um determinado processo filho?

50

Como obter pid dos pais de um dado pid de crianças?

Eu sei que posso verificar manualmente em / proc, estou me perguntando se existe uma maneira melhor / inteligente de conseguir isso no Ubuntu. Observe que os pais podem ou não ser mortos.

obrigado

cache
fonte

Respostas:

58

Como obter um PID (PPID) pai a partir do ID do processo (PID) de uma criança usando a linha de comando

Usar ps -o ppid=

  • por exemplo , ps -o ppid= 2072retorna 2061, que você pode usar facilmente em um script, etc. ps -o ppid= -C foofornece o PPID do processo com comando foo. Você também pode usar o antiquado ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Explicação mais completa: ps -f 2072retornos
    UID PID   PPID   C TEMPO DE STAT TTY STAT CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • A pstreerelação é pstree -s -p 2072:
    Você está em: Home '' Diretório do Produto '' Artes e Artesanatos '' Artes Visuais
    
ish
fonte
Você conhece uma maneira de fazer pstree mostrar invocações (comando + argumentos) sem dividir linhas? Minha instalação divide automaticamente as linhas se eu adicionar argumentos, mesmo que o resultado possa caber facilmente em uma linha. A página de manual parece dizer o mesmo, mas não fornece um motivo. Minha solução alternativa envolve a extração de PIDs da pstree e a utilização ps -o args ...dos resultados, mas isso tem um pouco de cheiro.
John P #
Apenas algo que me surpreendeu: o espaço depois, ppid= mas antes do pid, parece necessário. Eu obtive resultados diferentes se o omiti.
Gregory Arenius
8

Usando apenas variável para obter o PID pai:

echo $PPID

se você precisar do comando deste pai pid:

cat /proc/$PPID/comm

se você precisar da linha de comando completa (com todas as opções):

cat /proc/$PPID/cmdline

Explicação

  • $PPID é definido pelo shell, é o PID do processo pai
  • em /proc/, você tem alguns diretórios com o PID de cada processo. Então, se você cat /proc/$PPID/commecoar o nome do comando do PID

Check man proc

Gilles Quenot
fonte
1
Esta é a melhor resposta. procfs é uma API do kernel. executar um comando e analisar a saída é um absurdo.
Massimo
Este também é potencialmente o mais portátil, PPIDé definido como parte do padrão POSIX, portanto, qualquer shell compatível com POSIX deve defini-lo adequadamente. Veja pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Usando pstreepelo nome do comando

Utilizando pstreevocê pode procurar pelo nome do processo filho e obter o ID do Processo (PID) junto com os pais, avós e quaisquer filhos do processo filho:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

Nesse caso, sleepé o comando filho e é o PID 8414. Seu ID pai é 841 e é chamado display-auto-brightness. O avô é um shell ( sh) com um ID de processo de 839. O bisavô está croncom um ID de processo de 795. O tataravô também crontem um ID de processo 763.

Se você deseja pesquisar por ID do processo em sleepvez de nome, pode usar:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

Observe que o sleepID do processo foi alterado para 14653. O pai (PID 841) dorme por 1 minuto, acorda por uma fração de segundo e inicia um novo sleepcomando que obtém um novo ID de processo. Esse é outro motivo pelo qual pesquisar sleepé mais fácil do que pesquisar por ID do processo.

Este código foi retirado de: Ajustar automaticamente o brilho da tela com base no nascer e pôr do sol e adaptado a esta pergunta.


Para ver uma cadeia aninhada no processo de inicialização, use o PID em vez do nome:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Nota: Outro minuto se passou e o comando sleep recebe um novo PID (8541).

WinEunuuchs2Unix
fonte
No seu exemplo, este método não teria trabalhado para o processo cron com PID 807.
Olorin
@ Olorin Em ambos os exemplos, você poderia entrar em grep 807ou crona mesma linha seria recuperada, assim como mais filhos se surgisse. Mas a questão era encontrar o pai, não todas as crianças.
WinEunuuchs2Unix
Exatamente - como você encontra o pai do PID 807 com essa saída? Você não pode, becvause não inclui o pai de 807.
Olorin
@ Olorin O pai do cron é systemd, que é o PID 1. Eu não acho que você pode matar o PID 1. #
WinEunuuchs2Unix
Eu não disse nada sobre matar nada. Só para esclarecer, agora você está afirmando que pegar a primeira linha de pstree ou grepping pelo nome do comando sempre dará ao PID pai o pai?
Olorin
0

ps -efj também pode ser usado para o mesmo.

Por exemplo,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
Obi Wan - PallavJha
fonte