Eu sei que, nohup
sendo um binário, pode ser alcançado a partir de qualquer shell. Mas o exec
built-in provavelmente existe em todos os shell.
Existe um motivo para preferir um deles, ao outro?
O que é melhor, um peixe ou uma bicicleta? nohup
e exec
fazer coisas diferentes.
exec
substitui o shell por outro programa. Usar exec
um simples trabalho em segundo plano não é útil: exec myprogram; more stuff
substitui o shell por myprogram
e, portanto, não é executado more stuff
, ao contrário do myprogram; more stuff
que é executado more stuff
quando myprogram
termina; mas exec myprogram & more stuff
começa myprogram
em segundo plano e depois é executado more stuff
, exatamente como myprogram & more stuff
.
nohup
executa o programa específico com o sinal SIGHUP ignorado. Quando um terminal é fechado, o kernel envia o 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. A execução de um trabalho nohup
evita que ele seja eliminado dessa maneira se o terminal morrer (o que acontece, por exemplo, se você efetuou login remotamente e a conexão caiu, 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 na saída ou na saída de erro. Observe que nohup
não redireciona a entrada. Para desconectar totalmente um programa do terminal onde você o iniciou, use
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
, o shell não está mais em execução: foi substituído porfirefox
. Você pode pensarexec
em combinar sair de um programa e iniciar um novo, mas mantendo o mesmo ID do processo. O terminal continua funcionando porque nada disse para parar. Quando você sai mais tarde do Firefox, ofirefox
processo termina. O terminal percebe que seu processo filho saiu e, portanto, sai por sua vez.exec &
=> executa um processo como um processo em segundo plano, para que você possa continuar usando o mesmo terminal para outros trabalhos.nohup
=> evita todos os SIGHUP (sinal de término) e continua a execução mesmo se o terminal estiver fechado.exec
processo morre quando aSIGHUP
é recebido, mas onohup
processo continua.fonte
exec
substitui o processo em execução, mas isso não parece acontecer quando você usa o&
segundo plano para executar o comando exec'd. Nem no bash nem no zsh.exec smth &
é o mesmo que(exec smth) &
, não é isso que está acontecendo?(exec smth) &
. Mas eu não esperaria que fosse o mesmo - eu esperaria que fosse um erro de sintaxe, como você pode executar um processo (substituindo a si mesmo) e depois colocar em segundo plano o processo executado? Você não está mais lá para fazer isso.O comando
exec <command>
interno do shell substitui o shell por<command>
, nenhum novo processo, nenhum novo PID é criado. Após a conclusão<command>
normal, 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 seguirá para o hangups (kill -s 1), portanto não será encerrado quando o shell, o terminal a partir do qual foi iniciado, estiver fechado. Ao executá-lo em segundo plano, primeiro é criado um subshell e o comando é executado em segundo plano, retornando você ao prompt.No script, o efeito imediato é mais ou menos o mesmo, porém,
<command>
é iniciado pelo seu script e o script continuará sem aguardar o<command>
início, o envio da saída ou a conclusão.fonte
script.sh &
ouexec script.sh &
. Nos dois casos, o comando é executado em um processo filho, não substitui o processo de chamada, consulte: paste.alacon.org/44474 (muito tempo para copiá-lo aqui em um comentário ...). O que estou fazendo errado?Você não pode comparar
nohup
comexec
. Quando você executa um executável comnohup
, o processo não será interrompido quando você fizer logout (sessão ssh); geralmentenohup
é usadonice
para executar processos com uma prioridade mais baixa. OHUP
sinal é, por convenção, a maneira como um terminal avisa processos dependentes de logoutfonte