Existem muitos casos em que pequenas diferenças entre ambientes podem morder você. Este é um no qual eu corri recentemente. Qual é a diferença entre esses dois comandos?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
A resposta é a mesma de sempre - depende.
nohup capta o sinal de desligamento enquanto oe comercial não.
Qual é o sinal de desligamento?
SIGHUP - hangup detectado no terminal de controle ou morte do processo de controle (valor: 1).
Normalmente, ao executar um comando usando & e saindo do shell posteriormente, o shell finaliza o subcomando com o sinal de desligamento (como kill -SIGHUP $ PID). Isso pode ser evitado usando nohup, pois ele captura o sinal e o ignora para que ele nunca atinja o aplicativo real.
Tudo bem, mas como neste caso, sempre existem 'mas'. Não há diferença entre esses métodos de inicialização quando o shell é configurado de uma maneira que não envia SIGHUP.
Caso esteja usando o bash, você pode usar o comando especificado abaixo para descobrir se o seu shell envia o SIGHUP para seus processos filhos ou não:
~ $ shopt | grep hupon
Além disso - há casos em que o nohup não funciona. Por exemplo, quando o processo iniciado reconecta o sinal NOHUP (feito dentro, no nível do código do aplicativo).
No caso descrito, a falta de diferenças me incomodou quando, dentro de um script de inicialização de serviço personalizado, havia uma chamada para um segundo script que configura e inicia o aplicativo apropriado sem um comando nohup.
Em um ambiente Linux, tudo funcionou perfeitamente; em um segundo, o aplicativo foi encerrado assim que o segundo script foi encerrado (detectando esse caso, é claro que me levou muito mais tempo do que você imagina: stuck_out_tongue :).
Após adicionar nohup como método de inicialização ao segundo script, o aplicativo continuará sendo executado mesmo que os scripts sejam encerrados e esse comportamento se torne consistente nos dois ambientes.