¿Cómo estos conceptos de proceso están relacionados entre sí - background
, zombie
, daemon
y 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 convertirsezombie
, porquezombie
es un proceso en segundo plano que se dejó sin un padredaemon
-without ctty
- todasdaemons
plazo sinctty
, pero no todos los procesos sinctty
sondaemons
background
-daemon
-background process
se puede recuperar para ejecutar nuevamente interactivamente,daemon is not
zombie
-without ctty
-zombie
es indiferente si estáctty
adjunto o nobackground
-without ctty
-processes
enviado a un segundo plano mientras lo tienenctty
, y se convierten en demonios o mueren sictty
se les quita
background-process
daemon
job-control
zombie-process
controlling-terminal
anatoly techtonik
fuente
fuente
fork()
desactivar una copia de usted mismo, usarexec()
en esa copia para reemplazarlo con lo que desea ejecutar y usarwait()
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 enwait()
que cosecha ese estado de salida (eliminándolo de la tabla de proceso y devolviéndolo a la persona que llama), tiene un zombie.Respuestas:
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:
waitpid(2)
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
, usarfg
ybg
). 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^C
se 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
init
systemd 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
init
crear, lo que los limpia a medida que salen, por lo que generalmente no los ves como zombis.Ver:
daemon(7)
.fuente
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()s
mismo, 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 elinit
programa, o en estos díassystemd
,. 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
bg
comando 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.fg
cambia 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.fuente
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 fuedisown
editado 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 usuariossh
ingresó a una máquina remota, inició algo parecido a un servidor web, luego lo ejecutódisown
y salió de lassh
sesió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ándolonohup
.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 presionarctrl+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.
fuente
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 ejecutartop
desde su terminal y luego presionarshift-v
para ver los árboles de proceso en estado salvaje.