¿Daemonizar un proceso en shell?

9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ da un ejemplo de demonización de un proceso en bash:

$ nohup firefox& &> /dev/null

Si estoy en lo correcto, el comando es el mismo que "nohup and background a process". ¿Pero no es un demonio más que un proceso nohupped y de fondo?

¿Qué pasos faltan aquí para demonizar un proceso?

Por ejemplo, ¿no es necesario cambiar el proceso padre al demonizar un proceso? Si es así, ¿cómo se hace eso en bash? Todavía estoy tratando de entender una respuesta relacionada https://unix.stackexchange.com/a/177361/674 .

¿Qué otros pasos y condiciones?

Vea mi pregunta relacionada https://stackoverflow.com/q/35705451/156458

Tim
fuente
1
depende de tu definición de demonios. Si simplemente quiere decir que se ejecuta en segundo plano separado de un terminal, entonces sí, está ejecutando Firefox como un demonio. Sin embargo, los demonios "estándar", por lo general, no son ejecutados por los usuarios, tienen un script de inicio de sesión y registro, y generalmente algún tipo de seguridad, a menudo aparece o selinux dependiendo de si está ejecutando Ubuntu o Fedora (o similar). Ver linfo.org/daemon.html .
Pantera
1
Echa un vistazo a start-stop-daemon Debian; Dejaré aquí un hilo relacionado del desbordamiento de pila stackoverflow.com/questions/16139940/… que es más interesante que la página de manual sin procesar
Rui F Ribeiro

Respuestas:

10

Del artículo de Wikipedia sobre daemon :

En un entorno Unix, el proceso padre de un demonio es a menudo, pero no siempre, el proceso init. Por lo general, un daemon se crea mediante un proceso que bifurca un proceso hijo y luego sale inmediatamente, lo que hace que init adopte el proceso hijo o que el proceso init inicie directamente el daemon. Además, un demonio lanzado al bifurcar y salir normalmente debe realizar otras operaciones, como disociar el proceso de cualquier terminal de control (tty). Tales procedimientos a menudo se implementan en varias rutinas de conveniencia, como daemon (3) en Unix.

Lea la página de manual de la daemonfunción.

Al ejecutar un comando en segundo plano desde un shell que sale inmediatamente, el PPID del proceso se convierte en 1. Fácil de probar:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Como puede ver, el proceso es propiedad del PID 1, pero aún está asociado con un TTY. Si salgo de este shell de inicio de sesión, vuelvo a iniciar sesión y psvuelvo a hacerlo , se convierte en TTY ?.

Lea aquí por qué es importante desconectarse de TTY .

Usando setsid(parte de util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Creo que ni siquiera tiene que redirigir stdin, stdout y stderr.

Gene Pavlovsky
fuente
3
Echa un vistazo a daemonize . Además de una buena herramienta, tiene muy buenas explicaciones sobre qué es un demonio.
Gene Pavlovsky
Solo tengo curiosidad si sabes una manera de disociar el proceso del tty sin cerrar sesión desde el shell desde el que se generó el proceso.
StoneThrow
1
@StoneThrow "sin cerrar sesión desde el shell desde el que se generó el proceso" Si usa el bash -ccontenedor, no hay TTY asociado con el proceso. Realmente es como lo demostró.
Bruno Bronosky
@StoneThrow, pero al hacer esta prueba, echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'se mostrará que es exactamente el mismo TTY para ambos, pero el comportamiento demostrado de obtener un TTY ?todavía se produce a pesar de que nunca se está "desconectando del shell" ni cerrando el TTY.
Bruno Bronosky
-1

Un demonio, por su nombre, no es más que un programa que se ejecuta hasta 1. el sistema se apaga; 2. Se le pide que pare. Aparte de eso, no tiene un significado mágico.

En estas circunstancias, ejecutar un script bash en segundo plano con nohup puede clasificarlo como un proceso de demonio.

¿Qué esperas encontrar y no encontrar? Si tiene algún problema, indíquelo con un código de muestra y segmentos de datos de muestra para solicitar ayuda adicional. Su pregunta, tal como está ahora, es demasiado amplia / general.

MelBurslan
fuente
Gracias. Creo que mi publicación tiene todo lo que pediste en tu último párrafo.
Tim
44
Umm esto no es verdad. Un demonio no tiene Terminal de control, no tiene stdout o stderr, y algunas otras cosas. Lea la primera estrofa de software.clapper.org/daemonize
Rich Homolka