O "e" comercial &
colocará o processo em segundo plano. Os descritores de arquivo (stdout, stderr, stdin) não são afetados.
Na saída do shell, o shell enviará SIGHUP
para tudo o que gerou, portanto, quando esse shell for fechado, o processo em segundo plano receberá SIGHUP
e provavelmente terminará. Em alguns shells (bash, zsh) você pode evitar isso usando o comando disown
, que irá dizer ao shell para não enviar SIGHUP
no fechamento do shell, e o processo continuará rodando.
Você também pode executar o equivalente a 'background usando um e comercial' enviando SIGSTOP
(geralmente Ctrl-Z no seu terminal) e, em seguida, aplicando o processo em segundo plano ( bg
).
nohup funciona ignorando o SIGHUP. Essa disposição de sinal é então passada para o processo filho que você executa. O nohup também verifica onde o stdout está indo e, se estiver indo para o terminal, ele redireciona o stdout e o stderr para um arquivo. Após a mudança na disposição do sinal e o possível redirecionamento, ele executa o processo em segundo plano.
Então, qual é a diferença?
Um processo em segundo plano não ignora SIGHUP
, embora você possa dizer ao seu shell para não enviá-lo com o disown. A menos que seja evitado, nohup
redireciona arquivos stdout para nohup.out, que eu geralmente odeio, se eu precisar excluir arquivos nohup.out aleatoriamente espalhados no meu disco.
Há também setsid
, o que torna seu processo um líder de grupo de processos. Um líder de grupo de processos nunca obterá SIGHUP
enviado para ele por qualquer shell. setsid
não faz muito com stdout / stderr, e eu costumo usar setsid
em vez de nohup
.