O que é melhor, um peixe ou uma bicicleta? nohup
e exec
fazem coisas diferentes.
exec
substitui o shell por outro programa. Usar exec
em um trabalho em segundo plano simples não é útil: exec myprogram; more stuff
substitui o shell por myprogram
e, portanto, não executa more stuff
, diferentemente de myprogram; more stuff
, que executa more stuff
quando myprogram
termina; mas exec myprogram & more stuff
começa myprogram
em segundo plano e, em seguida, executa more stuff
, como myprogram & more stuff
.
nohup
executa o programa específico com o sinal SIGHUP ignorado. Quando um terminal é fechado, o kernel envia SIGHUP para o processo de controle naquele terminal (ou seja, o shell). O shell, por sua vez, envia o SIGHUP para todos os trabalhos em execução em segundo plano. Executar um trabalho com nohup
impede que ele seja eliminado dessa forma se o terminal morrer (o que acontece, por exemplo, se você efetuou login remotamente e a conexão cair, ou se você fechar o emulador de terminal).
nohup
também redireciona a saída do programa para o arquivo nohup.out
. Isso evita que o programa morra porque não é capaz de gravar em sua saída ou saída de erro. Observe que nohup
não redireciona a entrada. Para desconectar completamente um programa do terminal em que você o iniciou, use
nohup myprogram </dev/null >myprogram.log 2>&1 &