Curso de Linux / Entender PID y PPID y consultar las relaciones entre procesos

El identificador de proceso (PID, process identifier) identifica un proceso dentro de su espacio de nombres, y el identificador del padre (PPID, parent process identifier) indica su padre actual. Permiten consultar relaciones y enviar señales, pero un número puede reutilizarse después de que termina su proceso.

¿Cuál es la diferencia entre PID y PPID?

Un proceso es una instancia de un programa en ejecución. Ejecutar el mismo programa dos veces suele crear procesos con PID distintos. El PPID identifica al padre actual: inicialmente puede ser el creador, pero puede cambiar si el proceso es adoptado.

Elemento Significado Uso principal
PID Número identificador del proceso actual Se utiliza para consultar procesos específicos o enviar señales
PPID PID del proceso padre del proceso actual Identificar su padre actual y la relación entre ambos

Si el intérprete de órdenes tiene PID 4250 y crea un sleep con PID 4321, el PPID del hijo puede ser 4250. Son números ilustrativos. Tras terminar un proceso, otro puede recibir su antiguo PID. Un mismo proceso también puede tener identificadores distintos en los espacios de nombres del host y del contenedor.

Consultar el PID y PPID del proceso actual

La forma más directa es especificar la columna deseada en ps. El siguiente comando hace que Bash expanda $$ al PID del shell actual y muestre la información de ese shell.

ps -p "$$" -o pid,ppid,user,stat,etime,args

La salida depende del entorno. PID identifica al intérprete de órdenes consultado y PPID a su padre actual. USER identifica al usuario, STAT muestra el estado, ELAPSED el tiempo transcurrido y COMMAND o ARGS el comando.

    PID    PPID USER     STAT     ELAPSED COMMAND
   4250    4110 learner  Ss         00:42 -bash

La tabla anterior es ilustrativa. Puede consultar un PID conocido con ps -p 4321 -o pid,ppid,args; si ya terminó, puede no aparecer, o su número podría haberse reutilizado. Para una vista amplia, use ps -eo pid,ppid,user,stat,args y, si necesita recorrerla, pase la salida a less.

pgrep -a -x sleep busca el nombre exacto sleep y muestra su línea de órdenes. Puede encontrar varios procesos: confirme propietario, inicio y comando antes de actuar. Consulte las opciones en la descripción de ps y la descripción de pgrep.

Comprobar relaciones padre-hijo en modo solo lectura

La práctica básica de crear procesos y enviar señales se realiza en Administración de procesos y trabajos. Aquí, se consultan directamente los hijos del shell actual sin finalizar nuevos procesos. ps mismo puede aparecer como un hijo temporal, y durante la consulta puede terminar un proceso.

ps -p "$$" -o pid,ppid,user,lstart,args
ps --ppid "$$" -o pid,ppid,stat,args

En Bash interactivo, $$ representa ese shell. Dentro de un sub-shell de Bash creado con paréntesis, $$ puede mantenerse como el valor de Bash padre, por lo que si necesita el valor del proceso Bash actual, distíngalo de $BASHPID. pstree -p "$$" se puede usar opcionalmente cuando pstree está instalado.

Distinguir espacios de nombres y reutilización de PID

Incluso para el mismo proceso, los PID visibles en el host y el contenedor pueden ser diferentes. El siguiente comando lee el identificador del espacio de nombres PID al que pertenece el shell actual y la jerarquía de PID basada en el sistema de archivos proc visible actualmente. En un entorno de espacio de nombres único, puede haber solo un número NSpid, y según la configuración del kernel/proc y los permisos, puede que no haya entrada o el acceso esté restringido.

readlink "/proc/$$/ns/pid"
grep '^NSpid:' "/proc/$$/status"

La diferencia de espacio de nombres es una diferencia de números según la ubicación de observación, y la reutilización de PID es el fenómeno en el que otro proceso recibe un número después de que un proceso anterior haya terminado. No interprete ambos fenómenos como el mismo ni mezcle los números del host y del contenedor al enviar señales.

¿Qué ocurre si el padre termina o el PID cambia?

Terminar el proceso padre no significa que el proceso hijo siempre termine junto con él. Los hijos que sigan vivos pueden ser adoptados por otro proceso, por lo que el PPID puede cambiar. Por lo tanto, no se debe asumir que al terminar un solo PID padre, todas las tareas por debajo también se limpiarán.

Por el contrario, si un hijo ha terminado pero el padre aún no recoge su estado de finalización, puede permanecer como un proceso zombi. Como este hijo ya ha terminado su ejecución, no se resuelve enviando repetidamente KILL a su PID. Se debe verificar la acción de recolección de hijos del programa padre. En la práctica, el wait de Bash utilizado es un ejemplo de recibir el estado de terminación de un hijo creado por uno mismo.

El PID es un identificador en el momento actual de un proceso en ejecución. No determine el objetivo de terminación solo con un número de archivo PID antiguo o anotado en la memoria. Verifique también el nombre, el propietario y la hora de inicio, y evite confundir los números de espacios de nombres PID diferentes dentro y fuera del contenedor.

¿Con qué se gestionan los procesos de servicio?

Los servicios gestionados con systemd pueden cambiar de PID al reiniciarse el proceso. En este caso, es más apropiado comprobar y gestionar la unidad de servicio en lugar de enviar señales directamente a un PID. Por ejemplo, en un sistema donde nginx.service está realmente instalado, se verifica el estado con systemctl status nginx.service y, en caso de que sea necesario reiniciar operativamente, solo se utiliza sudo systemctl restart nginx.service. En entornos donde no existe nginx o se utiliza un administrador de servicios diferente, se debe verificar el nombre y el método de gestión correspondientes.

PID es una pista para encontrar el proceso con precisión, y PPID es una pista para entender la relación parental que ese proceso tiene. Al detener un trabajo, es más seguro limitar primero el objetivo en lugar de enviar señales masivas a varios procesos solo buscando por nombre, y si se trata de un servicio del sistema, es mejor dejarlo al administrador de servicios.

Puede revisar el alcance de observación y los campos NSpid en la documentación del espacio de nombres PID y en la documentación de los campos de estado de proc.

Documentos de referencia

ps(1), pgrep(1), pstree(1), kill(1) documentos explican la operación de consulta y envío de señales. Los documentos de parámetros especiales de Bash y documentos de control de trabajos de Bash explican el significado de $$·$!·wait. La terminación del padre y el estado zombie se pueden consultar en wait(2).