Por que usar “nohup &” em vez de “exec &”

Por que usar “nohup &” em vez de “exec &”

Eu sei que, nohupsendo um binário, pode ser acessado de qualquer shell. Mas o execbuilt-in provavelmente existe em todos os shells.

Existe uma razão para preferir um deles ao outro?

Responder1

O que é melhor, um peixe ou uma bicicleta? nohupe execfazer coisas diferentes.

execsubstitui o shell por outro programa. Usar execem um trabalho simples em segundo plano não é útil: exec myprogram; more stuffsubstitui o shell por myprogramand so not run more stuff, ao contrário myprogram; more stuffdo que é executado more stuffquando myprogramtermina; mas exec myprogram & more stuffcomeça myprogramem segundo plano e depois é executado more stuff, exatamente como myprogram & more stuff.

nohupexecuta 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 SIGHUP para todos os trabalhos em execução em segundo plano. Executar um trabalho nohupevita que ele seja encerrado dessa maneira se o terminal morrer (o que acontece, por exemplo, se você estiver logado remotamente e a conexão cair, ou se você fechar o emulador de terminal).

nohuptambé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 isso nohupnão redireciona a entrada. Para desconectar totalmente um programa do terminal onde você o iniciou, use

nohup myprogram </dev/null >myprogram.log 2>&1 &

Responder2

exec &=> executa um processo como um processo em segundo plano para que você possa continuar usando o mesmo terminal para outros trabalhos.

nohup=> evita todo SIGHUP (sinal de término) e continua a execução mesmo se o terminal estiver fechado.

execo processo morre quando a SIGHUPé recebido, mas nohupo processo continua.

Responder3

O comando interno do shell exec <command>substitui o shell por <command>, nenhum novo processo, nenhum novo PID é criado. Após a conclusão <command>normalmente, seu terminal será fechado. Ao executá-lo em segundo plano, primeiro é criado um subshell, que é imediatamente substituído por <command>.

O nohup <command> comando será executado <command>, mas imune a interrupções (kill -s 1), portanto não será finalizado quando o shell, o terminal a partir do qual foi iniciado, for fechado. Ao executá-lo em segundo plano, primeiro um subshell é criado e o comando é executado em segundo plano, retornando você ao prompt.

No script, o efeito imediato é mais ou menos o mesmo, <command>é iniciado pelo seu script e o script continuará sem esperar <command>o início, o envio da saída ou a conclusão.

Responder4

Você não pode comparar nohupcom exec. Quando você executa um executável com nohup, o processo não será encerrado quando você sair (sessão ssh); geralmente nohupé usado para niceexecutar processos com prioridade mais baixa. O HUPsinal é, por convenção, a forma como um terminal avisa processos dependentes de logout

informação relacionada