Citando la documentación de bash (de man bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
Entonces, dicho simplemente, tener set -m
(el valor predeterminado para shells interactivos) le permite a uno usar elementos integrados como fg
y bg
, que se deshabilitarían en set +m
(el valor predeterminado para shells no interactivos).
Sin embargo, no es obvio para mí cuál es la conexión entre el control del trabajo y la eliminación de los procesos en segundo plano al salir, pero puedo confirmar que hay uno: la ejecución set -m; (sleep 10 ; touch control-on) &
creará el archivo si uno abandona el shell justo después de escribir ese comando, pero set +m; (sleep 10 ; touch control-off) &
no lo hará.
Creo que la respuesta se encuentra en el resto de la documentación para set -m
:
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
Esto significa que los trabajos en segundo plano iniciados set +m
no son "procesos en segundo plano" reales (los "procesos en segundo plano son aquellos cuya ID de grupo de procesos difiere de la terminal"): comparten la misma ID de grupo de procesos que el shell que los inició, en lugar de tener sus propios grupo de procesos como procesos de fondo adecuados. Esto explica el comportamiento observado cuando el shell se cierra antes de algunos de sus trabajos en segundo plano: si entiendo correctamente, cuando se cierra, se envía una señal a los procesos en el mismo grupo de procesos que el shell (por lo que se eliminan los trabajos en segundo plano iniciados set +m
), pero no a los de otros grupos de procesos (dejando solo los verdaderos procesos de fondo iniciados en set -m
).
Entonces, en su caso, el startup.sh
script presumiblemente comienza un trabajo en segundo plano. Cuando esta secuencia de comandos se ejecuta de forma no interactiva, como a través de SSH como en la pregunta a la que se vinculó, el control de trabajo está deshabilitado, el trabajo "en segundo plano" comparte el grupo de procesos del shell remoto y, por lo tanto, se elimina tan pronto como sale del shell. Por el contrario, al habilitar el control del trabajo en ese shell, el trabajo en segundo plano adquiere su propio grupo de procesos y no se elimina cuando sale del shell padre.
tomcat/bin/startup.sh
relaciona confg
/bg
?He encontrado esto en la lista de problemas de github, y creo que esto realmente responde a su pregunta.
Desde https://github.com/fabric/fabric/issues/395
fuente