¿Cómo obtener el PID padre de un proceso dado en GNU/Linux desde la línea de comandos?
Resuelto antes de la pregunta: cat /proc/1111/status | grep PPid
Resuelto antes de la pregunta: cat /proc/1111/status | grep PPid
Línea de comando:
ps -o ppid= -p 1111
Función:
ppid () { ps -p ${1:-$$} -o ppid=; }
Alias (una función es preferible ):
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=
Si no se suministra un PID a la función o al script, por defecto muestran el PPID del proceso actual.
Para usar el alias, se debe suministrar un PID.
Esta es una de esas cosas que aprendo, olvido, vuelvo a aprender, repito. Pero es útil. La bandera de la “s” del comando pstree muestra un árbol con una hoja en N:
pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
El pid de los padres está en el PPID variable de la cáscara, así que
echo $PPID
Para imprimir los ids padres (PPID
) de todos los procesos, use este comando:
ps j
Para el proceso único, sólo pase el PID, como: ps j 1234
.
Para extraer sólo el valor, filtra la salida por awk
, como:
ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps
Para obtener los PIDs de todos los padres, usa pstree
(instálalo si no lo tienes):
$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)
Para obtener los PIDs de los padres del proceso actual, usa echo $$
.
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
tmux
Un ejemplo un poco más complejo que comprueba el comando de un padre que inició el proceso actual Cambiar comm= a cmd= para ver el comando completo
Ejecute top
con las opciones que desee, como -u username and -p PID
.
Y mientras top
funciona, pulse f, muestra una lista de opciones que desea mostrar en la salida de top
, y los parámetros mostrados se mostrarán en letras MAYÚSCULAS y los parámetros que no se muestran se mostrarán en letras minúsculas.
Así que introduciendo la letra antes del parámetro puede activarlo o desactivarlo. Para el ID de proceso padre tiene que introducir b y luego pulsar Intro, mostrará el PPID en la salida superior.
Aquí hay una solución rápida que también debería funcionar:
ps $$
Vine aquí cuando trataba de encontrar “todos los procesos parentales de un pid”. Terminé haciendo mi propia función recursiva para hacerlo.
#!/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 "$@"