Quando você precisa de 'nohup' se você já está bifurcando usando '&'?

23

Primeiro esta questão está relacionada, mas definitivamente não é o mesmo que esta pergunta muito legal:

Diferença entre nohup, disown e &

Eu quero entender uma coisa: quando eu faço '&', estou dando certo?

É sempre útil fazer "nohup ... &" ou é simplesmente & suficiente?

Alguém poderia mostrar um caso em que você estaria usando '&' e ainda gostaria de usar 'nohup'?

    
por Cedric Martin 24.02.2012 / 14:30

3 respostas

31

Em primeiro lugar, toda vez que você executar um comando, o shell aplicará um novo processo, independentemente de você executá-lo com & ou não. & significa que você está executando em segundo plano.

Note que isto não é muito preciso. Alguns comandos, como cd , são funções do shell e geralmente não bifurcam um novo processo. type cmd geralmente informa se cmd é um comando externo ou uma função shell. type type informa que type é uma função de shell.

nohup é algo diferente. Diz ao novo processo para ignorar SIGHUP . É o sinal enviado pelo kernel quando o shell pai é fechado.

Para responder à sua pergunta, faça o seguinte:

  1. execute emacs & (por padrão, deve ser executado em uma janela X separada) .
  2. no shell pai, execute exit .

Você notará que a janela emacs está morta, apesar de ser executada em segundo plano. Esse é o comportamento padrão e nohup é usado precisamente para modificar isso.

A execução de um job em segundo plano (com & ou bg , aposto que outros shells também possuem outras sintaxes) é um recurso de shell, originado da capacidade dos sistemas modernos de realizar multitarefas. Em vez de bifurcar uma nova instância de shell para cada programa que você deseja iniciar, os shells modernos ( bash , zsh , ksh , ...) terão a capacidade de gerenciar uma lista de programas (ou jobs ). Apenas um deles por vez pode estar no primeiro plano , o que significa que ele recebe o foco do shell. Eu gostaria que alguém pudesse se expandir mais sobre as diferenças entre um processo rodando em primeiro plano e um em segundo plano (o principal acessando stdin / stdout ).

Em qualquer caso, isso não afeta a maneira como o processo filho reage a SIGHUP . nohup faz.

    
por 24.02.2012 / 14:52
16

É sempre útil fazer nohup ... & ? Sim. Se você acabou de iniciar um processo "em segundo plano" com & , esse novo processo ainda tem associação no "grupo de processos" do shell original. Se esse shell ou o grupo de processos receber certos sinais (SIGHUP, por exemplo), por padrão eles saem. Isso significa que se você executar um processo com & de um shell iniciado por um xterm, ou rxvt ou algum outro emulador de terminal de janelas, quando você fechar a janela, o processo de segundo plano obterá um SIGHUP. A maioria dos códigos escritos casualmente não manipula SIGHUP e, portanto, sai.

Se você usar nohup ... & , o comando nohup definirá SIGHUP como ignorado e, em seguida, executará o comando. Esse comando recém-executado mantém a máscara de sinalização que nohup setup, a menos que o comando faça algum sinal manipulando-se. Se você fechar o xterm ou rxvt ou qualquer outra coisa, o kernel entrega SIGHUP para o processo do comando, que é ignorado. Continua funcionando.

Fazer um nohup em um comando permite que ele continue em execução depois que você fechar o xterm ou você fizer logoff.

    
por 24.02.2012 / 15:46
-1

se você executar um programa em segundo plano (com & como sufixo) no sistema operacional linux e efetuar logoff mesmo depois disso, ele continuará em execução: experimente com:

  ping google.com > ping_result  &

Após o login volte, verifique o número de linhas no arquivo de saída ping_result que continuará aumentando significa que ainda está em execução, no entanto, foi informado que ele será fechado. então qual é o uso do comando nohup .

outro cenário == > conforme indicado acima para nohup emac & - > que deve manter emac em execução após o logout do sistema, mas ele não é exibido após o login.

    
por 09.08.2014 / 16:28