¿Cómo obtengo la identificación del proceso padre de un proceso hijo dado?

50

¿Cómo obtener padres pid de un niño pid pid?

Sé que puedo verificarlo manualmente en / proc, me pregunto si hay una manera inteligente / mejor de lograr esto en Ubuntu. Tenga en cuenta que el padre puede o no ser asesinado.

Gracias

cache
fuente

Respuestas:

58

Cómo obtener un PID primario (PPID) del ID de proceso (PID) de un niño usando la línea de comandos

Utilizar ps -o ppid=

  • Por ejemplo , ps -o ppid= 2072retornos 2061, que puede usar fácilmente en un script, etc., ps -o ppid= -C fooproporciona el PPID del proceso con el comando foo. También puede utilizar la antigua usanza ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Explicación más completa: ps -f 2072devoluciones
    UID PID   PPID   C TIEMPO TTY ESTADO TIEMPO CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • La pstreerelación es pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-helper (2072)
    
ish
fuente
¿Conoces una manera de hacer que pstree muestre invocaciones (comando + argumentos) sin dividir líneas? Mi instalación divide automáticamente las líneas si agrego argumentos, incluso si el resultado podría encajar fácilmente en una línea. La página del manual parece decir tanto, pero no da una razón. Mi solución consiste en extraer los PID de pstree y usarlos ps -o args ...en los resultados, pero eso tiene un poco de olor.
John P
Simplemente algo que me sorprendió: el espacio después ppid= pero antes del pid parece ser necesario. Obtuve resultados diferentes si lo omití.
Gregory Arenius
8

Usando solo la variable de para obtener el PID primario:

echo $PPID

si necesita el comando de este padre pid:

cat /proc/$PPID/comm

si necesita la línea de comando completa (con todas las opciones):

cat /proc/$PPID/cmdline

Explicación

  • $PPID está definido por el shell, es el PID del proceso padre
  • en /proc/, tienes algunos directorios con el PID de cada proceso. Entonces, si usted cat /proc/$PPID/comm, se hace eco del nombre del comando del PID

Comprobar hombre proc

Gilles Quenot
fuente
1
Esta es la mejor respuesta. procfs es una API de kernel. ejecutar un comando y analizar la salida no tiene sentido.
Massimo
Este también es potencialmente el más portátil, PPIDse define como parte del estándar POSIX, por lo que cualquier shell compatible con POSIX debe configurarlo adecuadamente. Ver pubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV
2

Utilizando pstreepor nombre de comando

Utilizando pstreepuede buscar por el nombre del proceso secundario y obtener el ID de proceso (PID) junto con los padres, abuelos y cualquier elemento secundario del proceso secundario:

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

En este caso sleepes el comando hijo y su PID es 8414. Su identificación principal es 841 y se llama display-auto-brightness. El abuelo es un shell ( sh) con un ID de proceso de 839. El bisabuelo tiene cronuna identificación de proceso de 795. El tatarabuelo también crontiene un ID de proceso 763.

Si desea buscar por ID de proceso en sleeplugar de nombre, puede usar:

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

Observe que la sleepID del proceso cambió a 14653. El padre (PID 841) duerme durante 1 minuto, se despierta por una fracción de segundo y luego inicia un nuevo sleepcomando que obtiene una nueva ID de proceso. Esta es otra razón por la cual buscar sleepes más fácil que buscar por ID de proceso.

Este código fue tomado de: Ajusta automáticamente el brillo de la pantalla según el amanecer y el atardecer y se adapta a esta pregunta.


Para ver una cadena anidada hasta el proceso de inicio, use el PID en lugar del nombre:

$ 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: Ha pasado otro minuto y el comando de suspensión obtiene un nuevo PID (8541).

WinEunuuchs2Unix
fuente
En su ejemplo, este método no habría funcionado para el proceso cron con PID 807.
Olorin
@Olorin En ambos ejemplos, podría aprovechar 807o crony la misma línea se volvería a acortar, así como a más niños si se genera. Pero la pregunta era sobre encontrar al padre, no a todos los hijos.
WinEunuuchs2Unix
Exactamente, ¿cómo encuentra el padre del PID 807 con esa salida? No puede, porque no incluye al padre de 807.
Olorin
@Olorin El padre de cron es systemd, que es PID 1. No creo que puedas matar el PID 1.
WinEunuuchs2Unix
No dije nada sobre matar nada. Solo para aclarar, ¿ahora está afirmando que tomar la primera línea de pstree o grepping para el nombre del comando siempre dará el PID primario?
Olorin
0

ps -efj También se puede utilizar para lo mismo.

Por ejemplo,

> 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
fuente