GNU/Linux >> Tutoriales Linux >  >> Linux

Descendientes del proceso?

Estoy tratando de construir un contenedor de procesos. El contenedor activará otros programas. Por ejemplo, un script bash que ejecuta tareas en segundo plano con el uso de '&'.

La característica importante que busco es esta:cuando elimino el contenedor, todo lo que se haya generado debajo de él debe eliminarse. No solo los hijos directos, sino también sus descendientes.

Cuando comencé este proyecto, creí erróneamente que cuando eliminabas un proceso, sus hijos también se eliminaban automáticamente. He buscado el consejo de personas que tenían la misma idea incorrecta. Si bien es posible captar una señal y transmitir la muerte a los niños, eso no es lo que busco aquí.

Creo que lo que quiero que se pueda lograr, porque cuando cierras un xterm, todo lo que se estaba ejecutando dentro de él se elimina a menos que se haya hecho un nohup. Esto incluye procesos huérfanos. Eso es lo que busco recrear.

Tengo una idea de que lo que estoy buscando involucra sesiones de Unix.

Si hubiera una forma confiable de identificar a todos los descendientes de un proceso, también sería útil poder enviarles señales arbitrarias. p.ej. SIGUSR1.

Respuesta aceptada:

Si envía una señal a un proceso, ese proceso se elimina. Me pregunto cómo comenzó el rumor de que matar un proceso también mata otros procesos, parece particularmente contrario a la intuición.

Sin embargo, hay formas de eliminar más de un proceso. Pero no enviará una señal a un proceso. Puede eliminar un grupo de procesos completo enviando una señal a -1234, donde 1234 es el PGID (ID del grupo de procesos), que es el PID del líder del grupo de procesos. Cuando ejecuta una tubería, toda la tubería comienza como un grupo de procesos (las aplicaciones pueden cambiar esto llamando a setpgid o setpgrp ).

Cuando inicia procesos en segundo plano (foo & ), están en su propio grupo de procesos. Los grupos de procesos se utilizan para administrar el acceso a la terminal; normalmente solo el grupo de procesos en primer plano tiene acceso a la terminal. Los trabajos en segundo plano permanecen en la misma sesión, pero no existe la posibilidad de eliminar una sesión completa o incluso de enumerar los grupos de procesos o los procesos en una sesión, por lo que no ayuda mucho.

Cuando cierras una terminal, el kernel envía la señal SIGHUP a todos los procesos que lo tienen como terminal de control. Estos procesos forman una sesión, pero no todas las sesiones tienen un terminal de control. Para su proyecto, una posibilidad es, por lo tanto, iniciar todos los procesos en su propia terminal, creada por secuencia de comandos, pantalla, etc. Elimine el proceso del emulador de terminal para eliminar los procesos contenidos (suponiendo que no se hayan separado con setsid ).

Relacionado:¿Cómo eliminar el proceso que mantiene el bloqueo apt?

Puede proporcionar más aislamiento ejecutando los procesos como su propio usuario, que no hace nada más. Entonces es fácil eliminar todos los procesos:ejecute kill (la llamada al sistema o la utilidad) como ese usuario y use -1 como argumento PID para matar, lo que significa "todos los procesos de ese usuario".

Puede proporcionar aún más aislamiento, pero con una configuración considerablemente mayor al ejecutar los procesos contenidos en un contenedor real.


Linux
  1. Cómo matar un proceso zombie en Linux

  2. Ejemplos de comandos kill en Linux

  3. Cómo matar el proceso zombie

  4. Cómo pausar/reanudar un proceso en Linux

  5. Matar procesos en Raspbian

Comando matar en Linux

Cómo matar procesos Zombie en Linux

5 formas rápidas de matar un proceso en Linux

Cómo MATAR un proceso en Linux

Cómo matar procesos Zombie en Ubuntu

4 formas de eliminar un proceso:kill, killall, pkill, xkill