Diferenças entre "<comando> e renúncia" e "nohup <comando> e renúncia"

41

Este é o meu entendimento sobre o uso &, disowne nohup:

  • <command>: É executado o processo dentro de corrente do terminal bashexemplo, no primeiro plano (isto é, o processo está listado como uma bashtarefa de primeiro plano e stdin, stdoute stderrainda estão ligados ao terminal ); não imune a puxões ;
  • <command> &: É executado o processo dentro de corrente do terminal bashexemplo, no fundo (ou seja, o processo está listada como um bashtrabalho de fundo e stdin, stdoute stderrainda estão ligados ao terminal ); não imune a puxões ;
  • <command> & disown: É executado o processo dentro de corrente do terminal bashexemplo, no fundo , mas o processo é separada das bashlista 's trabalhos' (isto é, o processo não está listado como uma bashtarefa de primeiro plano / segundo plano e stdin, stdoute stderrainda estão ligados ao terminal ); imune a interrupções ;
  • nohup <command> & disown: É executado o processo dentro de corrente do terminal bashexemplo, no fundo , mas o processo é separada das bashlista 's trabalhos' (isto é, o processo não está listado como uma bashtarefa de primeiro plano / segundo plano e stdin, stdoute stderrsão não ainda ligado ao terminal ) ; imune a interrupções ;

Assim, além de nohup <command> & disownbloquear stdine redirecionar stdoute stderrpara nohup.outpor padrão, parece-me que ele pode ser considerado totalmente equivalente a <command> & disown.

O acima está correto? Algum equívoco?

kos
fonte
11
O que você quer dizer com "imune a interrupções" e "não imune a interrupções"?
caos
2
@chaos Quer dizer que de terminação / matando o pai bashexemplo não irá matar o processo
kos

Respostas:

32

Sua compreensão é basicamente correta. Ambos disowne nohupsão usados ​​para permitir que você saia de uma sessão shell em execução sem interromper os trabalhos em execução. Alguns esclarecimentos:

  • Não há razão para correr nohup command & disown, nohupjá o negará.

  • nohupé definido pelo POSIX enquanto disown não é . Isto significa que enquanto muitas conchas (por exemplo bash, zsh, ksh) tê-lo, outros (por exemplo tcsh, csh, dashe sh) não vai tê-lo.

  • disownpode ser usado depois que um comando foi iniciado e nohupdeve ser usado antes.

Até onde eu sei, o efeito real dos dois comandos é o mesmo. Cada um deles possui características que o outro não possui (veja help disowne man nohup), mas sua função básica é a mesma, sim.

Para uma discussão muito mais detalhada sobre essas ferramentas e as diferenças entre elas, consulte as respostas aqui:

terdon
fonte
11
Nohupe disownnão são a mesma coisa e usar os dois comandos juntos NÃO é redundante. Veja esta resposta para uma descrição detalhada
memorando
7

Seus primeiro a terceiro pontos parecem bons, embora stdin, stdout and stderr are still bound to the terminalnão seja uma noção correta. stdinestá sempre vinculado ao terminal no sentido em que você sempre inseria o nome do arquivo em um comando via terminal ou através do terminal. stdout and stderr are still bound to the terminalestá tudo bem

Você tem stdin, stdout and stderr are not still bound to the terminalno quarto ponto que não está certo, como mencionado no meu parágrafo anterior. Também aqui você está usando /dev/nullcomo arquivo de entrada para command, por exemplo, se o comando estiver cat, você está usando-o como cat /dev/null.

O comando no seu quinto ponto não foi colocado corretamente, você usou nohup <command> & disown, enquanto o uso de um nohupou disownoutro não é necessário. Seus propósitos são os mesmos (ignorar o SIGHUP), mas funcionam de maneira um pouco diferente. Portanto, o comando pode ser simplificado como nohup <command> &.

heemail
fonte