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 &