2010-06-08 09:42:29 +0000 2010-06-08 09:42:29 +0000
94
94

¿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

Respuestas (10)

112
112
112
2010-06-08 11:21:06 +0000

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.

15
15
15
2013-01-31 20:32:13 +0000

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
13
13
13
2012-09-24 11:55:28 +0000

El pid de los padres está en el PPID variable de la cáscara, así que

echo $PPID
12
12
12
2016-02-19 21:31:34 +0000

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 $$.

6
6
6
2010-06-08 09:44:05 +0000

Lea /proc/$PID/status. Se puede escribir fácilmente:

#!/bin/sh P=$1 if [-z "$P"]; then read P fi cat /proc/"$P"/status | grep PPid: | grep -o "[0-9]\*"
4
4
4
2014-10-21 17:30:05 +0000

En Linux:

ps hoppid $thatprocess
2
2
2
2014-10-19 20:08:11 +0000
$ 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

1
1
1
2012-11-23 12:21:12 +0000

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.

1
1
1
2013-09-12 06:18:04 +0000

Aquí hay una solución rápida que también debería funcionar:

ps $$
0
0
0
2019-10-30 21:51:11 +0000

todos los procesos parentales de un pid

Vine aquí cuando trataba de encontrar “todos los procesos parentales de un pid”. Terminé haciendo mi propia función recursiva para hacerlo.

pid_lineage.sh

#!/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 "$@"

Preguntas relacionadas

6
10
10
7
3