Diferença entre nohup, disown e &

505

Quais são as diferenças entre

$ nohup foo

e

$ foo &

e

$ foo & 
$ disown
    
por lesmana 09.11.2010 / 17:16

3 respostas

473

Primeiro, vamos 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 executando foo é criado.
  • O processo herda stdin, stdout e stderr do shell. Portanto, ele também está conectado ao mesmo terminal.
  • Se o shell receber um SIGHUP , ele também enviará um SIGHUP para o processo (o que normalmente faz com que o processo termine).
  • Caso contrário, o shell aguarda (está bloqueado) até o processo terminar.

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

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

Agora, disown remove o trabalho da lista de trabalhos do shell, portanto, todos os subpontos acima não se aplicam mais (incluindo o processo que está sendo enviado um SIGHUP pelo shell). Entretanto, note que ainda está conectado ao terminal, portanto, se o terminal for destruído (o que pode acontecer se for um arquivo, como os criados por xterm ou ssh , e o programa de controle é encerrado, fechando o xterm ou encerrando a conexão SSH ), o programa falhará assim que ele tentar ler entrada padrão ou escreva para a saída padrão.

O que o nohup faz, por outro lado, é separar efetivamente o processo do terminal:

  • Fecha a entrada padrão (o programa não consegue ler nenhuma entrada, mesmo que seja executado em primeiro plano. Não é 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 , de modo que o programa não falhará para gravar na saída padrão se o terminal falhar, portanto, qualquer que seja o processo gravado, ele não será perdido.
  • Impede que o processo receba SIGHUP (daí o nome).

Observe que nohup não remove o processo do controle de tarefa do shell e também não o coloca em segundo plano (mas como o trabalho foreground nohup é mais ou menos inútil, você geralmente colocaria em segundo plano usando & ). Por exemplo, diferentemente de disown , o shell ainda lhe dirá quando a tarefa nohup foi concluída (a menos que o shell seja terminado antes, é claro).

Então, para resumir:

  • & coloca a tarefa em segundo plano, isto é, bloqueia a tentativa de ler a entrada e faz com que ela não espere sua conclusão.
  • disown remove o processo do controle de tarefa do shell, mas ainda o deixa conectado ao terminal. Um dos resultados é que o shell não envia um SIGHUP . Obviamente, ele só pode ser aplicado a tarefas em segundo plano, porque você não pode inseri-lo quando um trabalho em primeiro plano está em execução.
  • nohup desconecta o processo do terminal, redireciona sua saída para nohup.out e protege-o de SIGHUP . Um dos efeitos (o nome) é que o processo não receberá nenhum SIGHUP enviado. É 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).
por 06.08.2014 / 12:09
165

Usar & faz com que o programa seja executado em segundo plano, portanto, você receberá um novo prompt de shell em vez de bloqueá-lo até que o programa termine. nohup e disown não são amplamente relacionados; eles suprimem os sinais SIGHUP (hangup) para que o programa não seja automaticamente apagado quando o terminal de controle é fechado. nohup faz isso quando o trabalho começa. Se você não nohup de um trabalho quando ele começa, você pode usar disown para modificar um trabalho em execução; sem argumentos, modifica o trabalho atual, que é o que acabou de ser colocado em segundo plano

    
por 09.11.2010 / 17:26
6

Esta é minha experiência ao tentar executar o soffice em segundo plano, seguindo um comando que não termina (por exemplo, tail ). Para este exemplo, usarei sleep 100 .

&

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

I see soffice logs / by pressing Ctrl-C soffice stops

nohup .. &

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

I don't see soffice logs / by pressing Ctrl-C soffice stops

& renegar

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

I see soffice logs / by pressing Ctrl-C soffice stops

setsid .. &

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

I see soffice logs / by pressing Ctrl-C soffice DOES NOT STOP

Para economizar espaço:
nohup setsid .. : não mostra logs / soffice NÃO PARAR em Ctrl - C
nohup com & disown no final: não mostra logs / soffice pára em Ctrl - C

    
por 21.03.2017 / 20:32