ti-enxame.com

Diferença entre Nohup, renegado e &

Quais são as diferenças entre

$ Nohup foo

e

$ foo &

e

$ foo & 
$ disown
600
lesmana

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 executando 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 envia um SIGHUP para o 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 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 tenta ler a partir de stdin, ele é interrompido.
  • Ele é colocado na lista de trabalhos em segundo plano que a Shell gerencia, o que significa especialmente:
    • Ele está listado com jobs e pode ser acessado usando %n (onde n é o número do trabalho).
    • Ele pode ser transformado em um trabalho em primeiro plano usando fg, caso em que continua como se você não tivesse usado & (e se foi interrompido devido à tentativa de leitura da entrada padrão, agora pode prosseguir com a leitura 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, para que todos os subpontos acima não se apliquem mais (incluindo o processo que está sendo enviado um SIGHUP pelo Shell). No entanto, observe que ainda está conectado ao terminal, portanto, se o terminal for destruído (o que pode acontecer se for um pty, como os criados por xterm ou ssh, e o programa de controle é finalizado, fechando o xterm ou finalizando a SSH conexão), o programa falhará assim que tentar ler da entrada padrão ou gravar na saída padrão.

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

  • Ele fecha a entrada padrão (o programa não consegue ler qualquer entrada, mesmo que seja executada em primeiro plano. Não é interrompido, mas será receba 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 ao gravar na saída padrão se o terminal falhar, portanto, o que o processo gravar não será perdido.
  • Impede que o processo receba um SIGHUP (portanto, o nome).

Observe que Nohup não remove o processo do controle de tarefas do Shell e também não o coloca em segundo plano (mas desde que um primeiro plano Nohup trabalho é mais ou menos inútil, você geralmente o coloca em segundo plano usando &). Por exemplo, diferentemente de disown, o Shell ainda informa quando o trabalho 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 as entradas e faz com que o Shell não espere sua conclusão.
  • disown remove o processo do controle de trabalho do Shell, mas ainda o deixa conectado ao terminal. Um dos resultados é que o Shell não enviará um 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.
  • Nohup desconecta o processo do terminal, redireciona sua saída para Nohup.out e o protege de SIGHUP. Um dos efeitos (o de nomeação) é 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).
595
celtschk

Usando & 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. Nohup e disown sã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. Nohup faz isso quando o trabalho começa. Se você não Nohup um trabalho quando for iniciado, poderá usar disown para modificar um trabalho em execução; sem argumentos, modifica o trabalho atual, que foi o que acabou de ser publicado

174
Michael Mrozek

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

I veja soffice logs/pressionando Ctrl-C soffice para

Nohup .. &

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

I não vê soffice logs/pressionando Ctrl-C soffice para

e renegar

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

I veja soffice logs/pressionando Ctrl-C soffice para

setsid .. &

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

I veja soffice logs/pressionando Ctrl-C soffice NÃO PARA

Para economizar espaço:
Nohup setsid ..: não mostra logs/soffice NÃO PARA em Ctrl-C
Nohup com & disown no final: não mostra logs/o soffice para em Ctrl-C

9
Marinos An