Como obter o PID pai de um determinado processo no GNU/Linux a partir da linha de comando?
Resolvido antes da pergunta: cat /proc/1111/status | grep PPid
Resolvido antes da pergunta: cat /proc/1111/status | grep PPid
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'
Script:
#!/bin/sh
pid=$1
if [-z $pid]
then
read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=
Se não for fornecido um PID para a função ou para o script, por defeito mostram o PPID do processo actual.
Para utilizar o alias, deve ser fornecido um PID.
Esta é uma dessas 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
O pid pai está em shell variável PPID, portanto
echo $PPID
Para imprimir os ids dos pais (PPID
) de todos os processos, use este comando:
ps j
Para o processo único, basta passar o PID, como: ps j 1234
.
Para extrair apenas o valor, filtrar 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 os PID 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 dos pais do processo actual, use echo $$
.
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
tmux
Um exemplo um pouco mais complexo que verifica o comando de um dos pais que iniciou o processo actual Alterar comm= para cmd= para ver o comando completo
Run top
com as opções que desejar, como -u username and -p PID
.
E enquanto o top
estiver a funcionar, prima f, mostra uma lista de opções que deseja mostrar na saída do top
, e os parâmetros mostrados serão mostrados em letras CAPITAL e os parâmetros que serão mostrados em letras pequenas ou não.
Assim, ao introduzir a letra antes do parâmetro, pode activá-lo ou desactivá-lo. Para a ID do processo pai tem de introduzir b e depois premir Enter, será mostrado o PPID na saída superior.
Aqui está uma solução rápida que também deve funcionar:
ps $$
Eu vim aqui quando estava a tentar encontrar “todos os processos parentais de um pid”. Acabei por fazer a minha própria função recursiva para o fazer.
#!/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 "$@"