Hay muchos casos en que pequeñas diferencias entre entornos pueden morderlo. Este es uno en el que me he encontrado recientemente. ¿Cuál es la diferencia entre estos dos comandos?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
La respuesta es la misma de siempre: depende.
nohup capta la señal de colgar mientras que el ampersand no.
¿Cuál es la señal de colgar?
SIGHUP: bloqueo detectado en el terminal de control o muerte del proceso de control (valor: 1).
Normalmente, cuando ejecuta un comando usando & y luego sale del shell, el shell terminará el subcomando con la señal de suspensión (como kill -SIGHUP $ PID). Esto se puede evitar usando nohup, ya que capta la señal y la ignora para que nunca llegue a la aplicación real.
Bien, pero como en este caso siempre hay 'peros'. No hay diferencia entre estos métodos de inicio cuando el shell se configura de manera que no envía SIGHUP en absoluto.
En caso de que esté usando bash, puede usar el comando especificado a continuación para averiguar si su shell envía SIGHUP a sus procesos secundarios o no:
~ $ shopt | grep hupon
Y además, hay casos en los que nohup no funciona. Por ejemplo, cuando el proceso que inicia vuelve a conectar la señal NOHUP (se realiza en el interior, en el nivel del código de la aplicación).
En el caso descrito, la falta de diferencias me mordió cuando dentro de un script de inicio de servicio personalizado hubo una llamada a un segundo script que configura e inicia la aplicación adecuada sin un comando nohup.
En un entorno Linux, todo funcionó sin problemas, en un segundo la aplicación se cerró tan pronto como salió el segundo script (detectar ese caso, por supuesto, me llevó mucho más tiempo de lo que podrías pensar: stuck_out_tongue :).
Después de agregar nohup como método de inicio a la segunda secuencia de comandos, la aplicación sigue ejecutándose incluso si las secuencias de comandos se cierran y este comportamiento se volvió coherente en ambos entornos.