Diferença entre nohup, renegado e &


578

Quais são as diferenças entre

$ nohup foo

e

$ foo &

e

$ foo & 
$ disown

50
Aguarde, você pode recusar sem especificar um PID? Ótimo!
ripper234

34
Há também o foo &!que deve ser igual a negá-lo desde o início.
user4514

26
O Bash não suporta & !.
Jonas Kongslund

20
foo & disownnegar imediatamente.
Ctrl-alt-delor 13/07/16

9
Eu adoraria ver uma menção setsid, e como se relaciona com disownenohup
YoungFrog

Respostas:


557

Vamos primeiro ver o que acontece se um programa for iniciado a partir de um shell interativo (conectado a um terminal) sem &(e sem nenhum redirecionamento). Então, vamos supor que você acabou de digitar foo:

  • O processo em execução fooé criado.
  • O processo herda stdin, stdout e stderr do shell. Portanto, também está conectado ao mesmo terminal.
  • Se o shell receber um SIGHUP, ele também enviará um SIGHUPao processo (o que normalmente causa o término do processo).
  • Caso contrário, o shell aguarda (está bloqueado) até o processo terminar.

Agora, vejamos o que acontece se você colocar o processo em segundo plano, ou seja, digite foo &:

  • O processo em execução fooé criado.
  • O processo herda stdout / stderr do shell (então ele ainda grava no terminal).
  • O processo em princípio também herda stdin, mas assim que tenta ler a partir de stdin, ele é interrompido.
  • Ele é colocado na lista de trabalhos em segundo plano que o shell gerencia, o que significa especialmente:
    • Ele está listado jobse pode ser acessado usando %n(onde nestá o número do trabalho).
    • Ele pode ser transformado em um trabalho em primeiro plano fg, caso em que continua como se você não o tivesse usado &(e se foi interrompido por tentar ler da entrada padrão, agora pode prosseguir para a leitura no terminal).
    • Se o shell recebeu um SIGHUP, ele também envia um SIGHUPpara o processo. Dependendo do shell e, possivelmente, das opções definidas para o shell, ao finalizar o shell, ele também enviará um SIGHUPpara o processo.

Agora, disowno trabalho é removido da lista de trabalhos do shell, para que todos os subpontos acima não se apliquem mais (incluindo o processo enviado SIGHUPpelo shell). No entanto, observe que ele ainda está conectado ao terminal, portanto, se o terminal for destruído (o que pode acontecer se for um pty, como os criados por xtermou ssh, e o programa de controle for encerrado, feche o xterm ou encerre a conexão SSH ) , o programa falhará assim que tentar ler da entrada padrão ou gravar na saída padrão.

O nohupque, por outro lado, é separar efetivamente o processo do terminal:

  • Ele fecha a entrada padrão (o programa não poderá ler nenhuma entrada, mesmo que seja executado em primeiro plano. Não for interrompido, mas receberá um código de erro ou EOF).
  • Ele redireciona a saída padrão e o erro padrão para o arquivo nohup.out, para que o programa não falhe na gravação na saída padrão se o terminal falhar, para que o processo de gravação não seja perdido.
  • Impede que o processo receba um SIGHUP(assim, o nome).

Note-se que nohupse não remover o processo de controle de tarefas do shell e também não colocá-lo em segundo plano (mas desde um primeiro plano nohupde trabalho é mais ou menos inútil, você geralmente colocá-lo em segundo plano usando &). Por exemplo, diferentemente de disown, o shell ainda informa quando o trabalho de nohup foi concluído (a menos que o shell seja encerrado antes, é claro).

Então, para resumir:

  • & coloca o trabalho em segundo plano, ou seja, impede a tentativa de ler a entrada e faz com que o shell não aguarde sua conclusão.
  • disownremove o processo do controle de trabalho do shell, mas ainda o deixa conectado ao terminal. Um dos resultados é que o shell não o envia a SIGHUP. Obviamente, ele só pode ser aplicado a trabalhos em segundo plano, porque você não pode inseri-lo quando um trabalho em primeiro plano está em execução.
  • nohupdesconecta o processo do terminal, redireciona sua saída nohup.oute a protege SIGHUP. Um dos efeitos (o de nomeação) é que o processo não receberá nenhum envio SIGHUP. É completamente independente do controle do trabalho e pode, em princípio, ser usado também para trabalhos em primeiro plano (embora isso não seja muito útil).

8
+1 Obrigado. O que acontece quando se usa disown, nohup e & juntos?
Tim

15
Se você usar os três juntos, o processo será executado em segundo plano, será removido do controle de trabalho do shell e será efetivamente desconectado do terminal.
Celtschk #


1
qual é a diferença entre disown %1e disown -h %1? O segundo manterá um trabalho regular (mas ignora o sinal HUP) até a saída do terminal?
schemacs

4
Talvez vale inclusive (foo&)subshell
jiggunjer

169

O uso &faz com que o programa seja executado em segundo plano; portanto, você receberá um novo prompt de shell em vez de bloquear até que o programa termine. nohupe disownsão amplamente independentes; eles suprimem os sinais SIGHUP (hangup) para que o programa não seja interrompido automaticamente quando o terminal de controle estiver fechado. nohupfaz isso quando o trabalho começa. Se você não executar nohupum trabalho quando ele começar, poderá disownmodificar um trabalho em execução; sem argumentos, modifica o trabalho atual, que foi o que acabou de ser publicado


10
Pequena diferença entre nohup e rejeitado: o comando disown o removerá da sua lista de trabalhos; nohup não vai.
Shawn J. Goff

191
nohupe disownpode-se dizer que ambos suprimem SIGHUP, mas de maneiras diferentes. nohupfaz com que o programa ignore o sinal inicialmente (o programa pode mudar isso). nohuptambém tenta providenciar para que o programa não tenha um terminal de controle, para que ele não seja enviado SIGHUPpelo kernel quando o terminal estiver fechado. disowné puramente interno à concha; faz com que o shell não seja enviado SIGHUPquando terminar.
Gilles

27
@ Gilles, seu comentário vale uma resposta em si.
Lesmana

5
Apenas um esclarecimento sobre o comentário de @ ShawnJ.Goff referente à disownremoção do trabalho da lista de trabalhos. Se você não especificar uma opção, ela a removerá da lista de trabalhos. No entanto , se você especificar a -hopção, cada jobpec não será removido da tabela. Em vez disso, ele faz com que SIGHUPnão seja enviado para o trabalho se o shell receber um SIGHUP.
Tacotuesday 13/11/2013

4
Apenas para esclarecer, o uso &não fornece um terminal, ele se desconecta stdindo processo e faz com que seja executado em segundo plano, mas ambos stdoute stderrainda está anexado ao tty atual. Isso significa que você pode misturar textos de diferentes programas, o que pode ser bastante irritante se você o fizer gimp &e receber muitos erros de GTK + ao tentar usar esse tty para outra coisa.
Frank

8

Aqui está minha experiência tentando executar o soffice em segundo plano, seguindo um comando não-finalizável (por exemplo tail). Neste exemplo, usarei sleep 100.

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Eu vejo logs do soffice / pressionando Ctrl- o Csoffice para

nohup .. &

#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Eu não vejo soffice registros / pressionando Ctrl- Cparadas soffice

e renegar

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

Eu vejo logs do soffice / pressionando Ctrl- o Csoffice para

setsid .. &

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Eu vejo logs do soffice / pressionando Ctrl- Csoffice NÃO PARA

Para economizar espaço::
nohup setsid ..não mostra logs / soffice NÃO PARA Ctrl-C
nohup com & disownno final: não mostra logs / soffice Ctrl-C


2
Embora aprecie o esforço de mencionar setsid e mostrar o que acontece nessa situação específica, gostaria de ver uma resposta mais completa. Em particular, a diferença e semelhanças de cada solução, tanto visíveis (o que acontece quando fecha o shell ou o terminal, para onde vai a saída, ...) quanto invisíveis (como as coisas são feitas sob o capô e suas implicações). A resposta aceita é uma boa base para isso.
YoungFrog

1
@YoungFrog eu vou concordar com isso!
Marinos An

Para mim, com nohup ⟨command⟩ & disowno processo criado não pára Ctrl+C.
k.stm

@ k.stm Você tentou soffice? sofficecomando parece ter algo diferente. Por isso, considerei adicioná-lo aqui como uma exceção de regra. por exemplo, ao usar :, nohup .. &pressionar Ctrl-cnormalmente não faz com que o comando seja interrompido, mas com sofficeele. Eu espero até que alguém pisa sobre isso e explica por que isso acontece com soffice :)
Marinos Um

@MarinosAn Sim, eu fiz. Eu corri nohup soffice &e apertei Ctrl+C. Nada aconteceu, como esperado.
k.stm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.