GNU/Linux >> Tutoriales Linux >  >> Linux

¿Daemonizar un proceso en shell?

Del artículo de Wikipedia sobre daemon:

En un entorno Unix, el proceso principal de un demonio es a menudo, pero no siempre, el proceso de inicio. Un demonio generalmente se crea mediante un proceso que bifurca un proceso secundario y luego sale inmediatamente, lo que hace que init adopte el proceso secundario, o mediante el proceso init que inicia directamente el demonio. Además, un demonio lanzado mediante bifurcación y salida generalmente debe realizar otras operaciones, como disociar el proceso de cualquier terminal de control (tty). Dichos procedimientos a menudo se implementan en varias rutinas de conveniencia como daemon(3) en Unix.

Lea la página de manual del daemon función.

Ejecutar un comando en segundo plano desde un shell que sale inmediatamente da como resultado que el PPID del proceso se convierta 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 de PID 1, pero aún está asociado con un TTY. Si me desconecto de este shell de inicio de sesión, vuelvo a iniciar sesión y hago ps nuevamente, el TTY se convierte en ? .

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 tienes que redirigir stdin, stdout y stderr.


Linux
  1. Obtener PID del proceso en Shell Script

  2. Crear un demonio en Linux

  3. ¿Cómo obtener el código de salida del proceso generado en el script de shell esperado?

  4. ¿Por qué popen() invoca un shell para ejecutar un proceso?

  5. ¿Por qué ejecutar un comando de shell de Linux con '&'?

¿Por qué "ls" requiere un proceso separado para su ejecución?

¿Alguna forma de ejecutar comandos de shell en Android mediante programación?

¿Qué es un archivo .sh?

Cómo obtener PID del proceso secundario bifurcado en el script de shell

Crear proceso zombie

¿Puede el proceso de inicio ser un script de shell en Linux?