Trasfondo, zombie, demonio y sin tonterías: ¿están conectados estos conceptos?


8

¿Cómo estos conceptos de proceso están relacionados entre sí - background, zombie, daemony without controlling terminal?

Siento que de alguna manera están cerca, especialmente a través del concepto de controlling terminal, pero todavía no tengo mucha información para contar una historia, como si necesita explicarle algo a un niño que lee un artículo sobre Linux sin mentir demasiado.

ACTUALIZACIÓN # 1: Por ejemplo (no sé si eso es cierto)

  • background- zombie- el proceso en primer plano no puede convertirse zombie, porque zombiees un proceso en segundo plano que se dejó sin un padre
  • daemon- without ctty- todas daemonsplazo sin ctty, pero no todos los procesos sin cttysondaemons
  • background- daemon- background processse puede recuperar para ejecutar nuevamente interactivamente,daemon is not
  • zombie- without ctty- zombiees indiferente si está cttyadjunto o no
  • background- without ctty- processesenviado a un segundo plano mientras lo tienen ctty, y se convierten en demonios o mueren si cttyse les quita

Un proceso en primer plano ciertamente puede ser un zombi, aunque generalmente no por un período de tiempo apreciable: la forma habitual para que un shell (u otro programa) ejecute un subproceso en primer plano es fork()desactivar una copia de usted mismo, usar exec()en esa copia para reemplazarlo con lo que desea ejecutar y usar wait()en la instancia original del programa (no la copia que se ejecutó exec()). En el muy, muy corto período de tiempo entre el momento en que el niño sale y el momento en wait()que cosecha ese estado de salida (eliminándolo de la tabla de proceso y devolviéndolo a la persona que llama), tiene un zombie.
Charles Duffy

@CharlesDuffy ¿es posible enviar a los padres a un segundo plano mientras se deja al niño corriendo en primer plano?
anatoly techtonik

En el control de trabajo típico , el shell ni siquiera sabe que el nieto está separado de su hijo directo; solo está esperando que su hijo salga, y si el niño está esperando que un nieto salga, bueno, eso es asunto del niño. Es decir, desde la perspectiva del caparazón que generó el padre, solo se trata de una unidad.
Charles Duffy

Respuestas:


10

En resumen, más enlaces.

zombi

un proceso que ha salido / terminado, pero cuyo padre aún no ha reconocido la terminación (usando las wait()llamadas del sistema). Los procesos inactivos se mantienen en la tabla de procesos para que sus padres puedan estar informados de que su hijo está saliendo del proceso hijo y de su estado de salida. Por lo general, un programa que bifurca a los niños también leerá su estado de salida a medida que salen, por lo que verá zombis solo si el padre está detenido o tiene errores.

Ver:

terminal de control, sesión, primer plano, fondo

Estos están relacionados con el control del trabajo en el contexto de un shell que se ejecuta en un terminal. Un usuario inicia sesión, se inicia una sesión, se vincula a un terminal (el terminal de control) y se inicia un shell. Luego, el shell ejecuta procesos y los envía en primer plano y en segundo plano según lo desee el usuario (usar &al iniciar el proceso, detenerlo con ^Z, usar fgy bg). Los procesos en segundo plano se detienen si se lee o escribe desde el terminal; los procesos en primer plano reciben la señal de interrupción si ^Cse golpea en el terminal. (Es el controlador de terminal del kernel el que maneja esas señales, el shell controla qué proceso (grupo) se envía al primer plano o al fondo.

Ver:

demonio

Un proceso que se ejecuta como un demonio suele ser algo que no debe estar vinculado a ningún terminal en particular (o una sesión de inicio de sesión, o un shell). No debería tener un terminal de control, por lo que no recibirá señales si el terminal se cierra, y uno generalmente tampoco quiere que haga E / S en un terminal. Iniciar un demonio desde la línea de comandos requiere romper todos los lazos con el terminal, es decir, iniciar una nueva sesión (en el sentido de control de trabajo, arriba) para deshacerse del terminal de control y cerrar los identificadores de archivo en el terminal. Por supuesto, algo que comenzó desde initsystemd o similar fuera de una sesión de inicio de sesión no tendría estos vínculos para empezar.

Dado que un demonio no tiene una terminal de control, no está sujeto a control de trabajo, y estar en el "primer plano" o "fondo" en el sentido de control de trabajo no se aplica. Además, los demonios generalmente se vuelven a initcrear, lo que los limpia a medida que salen, por lo que generalmente no los ves como zombis.

Ver:


4

Zombie no está realmente relacionado con los demás; simplemente es un proceso que ha finalizado, pero su proceso padre aún no ha leído su estado de salida con waitpid()o similar. No debería verlos a menos que un proceso tenga errores o esté detenido.

Un daemon es un programa que se ejecuta sin un terminal de control. Por lo general, cuando ejecuta el programa, éste fork()smismo, y el padre sale, por lo que el shell cree que el comando ha finalizado, y el proceso hijo se desconecta del terminal y escapa de la sesión de inicio de sesión. Desde que salió su proceso padre, su ID de proceso padre se convierte en 1, que tradicionalmente es el initprograma, o en estos días systemd,. Este proceso se asegura de cosechar a sus hijos cuando mueren para que no termines invadido por zombis.

Un proceso puede asociarse con un terminal de control , que es de donde normalmente obtiene su entrada y envía su salida. El terminal también puede enviar señales a procesos adjuntos e identifica un grupo de procesos como el grupo de primer plano . Los procesos que están en el grupo de primer plano pueden leer la entrada desde el terminal y se envían señales SIGINT y SIGSUSP cuando presiona Ctrl-C y Ctrl-Z. Cualquier proceso que no esté en el grupo de primer plano que intente leer desde el terminal se suspende con SIGTSTP.

El shell crea diferentes grupos de procesos para cada uno de los comandos de canalización que le pide que ejecute, y cambia cuál es el grupo de primer plano para mover los trabajos entre el primer plano y el fondo. Cuando ejecuta un comando, normalmente el shell crea un nuevo grupo de procesos y lo convierte en el grupo de primer plano . Si lo sufijas con un, &entonces el shell simplemente deja el grupo de primer plano donde estaba y, por lo tanto, el nuevo grupo está en segundo plano. Al presionar Ctrl-Z se envía SIGSUSP al grupo de primer plano, lo que hace que la mayoría de los comandos se suspendan, pero en lugar de suspender, el shell vuelve a cambiar el grupo de primer plano activo para que pueda solicitar un nuevo comando.

El bgcomando envía SIGCONT a un grupo de procesos para que pueda reanudar la ejecución en segundo plano después de haber sido suspendido con SIGSUSP. fgcambia el grupo de primer plano a uno de los grupos existentes que ya se están ejecutando en segundo plano, llevándolo al primer plano.


4

Ok, aquí está mi explicación con énfasis en las diferencias entre estos tipos de procesos (cortos pero informativos):

  • zombie- proceso que acaba de salir (finalizó su ejecución) pero que aún tiene una entrada en una tabla de proceso. Nota : el proceso zombie todavía tiene un padre y, por lo general, el objetivo de su existencia es informarle al proceso padre sobre el resultado de la ejecución del niño (código de salida, etc.).
  • disowned process(sin terminal de control): proceso que fue disowneditado explícitamente por el usuario o diseñado para separarse de un árbol de procesos principal. Aún se ejecutaría incluso si el proceso padre terminara la ejecución. Por ejemplo, el usuario sshingresó a una máquina remota, inició algo parecido a un servidor web, luego lo ejecutó disowny salió de la sshsesión. El proceso todavía se estaría ejecutando, ya que ya no es parte de un árbol de procesos padre. El proceso también puede ser desautorizado ejecutándolo nohup.
  • background process- se ejecuta en segundo plano - no divide la salida en el tty de un usuario. Al &final se ejecutó o se bifurcó a un fondo por diseño. Otra opción para enviar un proceso a un fondo es iniciarlo y presionar ctrl+z. Sin embargo, cuando el proceso padre finalice, el hijo que se ejecuta en segundo plano también finalizará ( nota de @psusi: el hecho anterior solo es cierto con los procesos iniciados desde un terminal por el usuario; de lo contrario, el proceso hijo se convierte en un 'orfante' y obtiene un proceso de inicio (pid 1) como padre).
    • daemon- Muy similar al proceso de fondo. También se ejecuta en segundo plano, pero probablemente se bifurcó implícitamente (por diseño). Por lo general, se sienta silenciosamente en un fondo esperando que ocurra algo y solo entonces realiza un trabajo real (conexión entrante, etc.). En realidad, el demonio puede ser rechazado (más probablemente) y el proceso en segundo plano dependiendo de su diseño.

Espero que esta explicación ayude a distinguir este tipo de procesos.


Agradable. La tabla de proceso pertenece al padre? ¿Entonces los zombis mueren sin su maestro?
anatoly techtonik

Tabla no es una palabra correcta. Es más bien un proceso tree. Sí, claro, el padre no está obligado a terminar después de que su hijo haya terminado (pero puede hacerlo si estaba esperando que un hijo terminara el procesamiento de algún tipo de cosas). Pero si el padre terminara, el niño terminaría definitivamente. Puede ejecutar topdesde su terminal y luego presionar shift-vpara ver los árboles de proceso en estado salvaje.
ddnomad

1
Un padre que termina no mata a sus hijos. Los niños huérfanos tienen su ID de proceso principal cambiada a init (1).
psusi

@psusi tienes razón, olvidé que es así solo con procesos iniciados en la terminal. Corregiré mi respuesta.
ddnomad

Simplemente eliminaría la frase "desaparecería pronto de una mesa". Sugiere que de alguna manera se desvanece automáticamente después de un tiempo, pero ese no es el caso; la "desaparición" es un evento muy concreto.
AnoE
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.