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

26

Primeiro, esta pergunta está relacionada, mas definitivamente não é a mesma que esta pergunta muito agradável:

Diferença entre nohup, renegado e &

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

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

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

Cedric Martin
fonte
11
Você leu a resposta aceita e seu tópico de comentário? Eles explicam o que nohupfaz. Que parte você confundiu?
Gilles 'SO- stop be evil'
3
@ Gilles: pode ser óbvio para você , porque você está familiarizado com essas coisas (consulte seu representante) ... No entanto, para começar, a resposta aceita no link que eu coloquei não diz uma palavra sobre o uso tanto nohup e '&' ... eu tenho certeza que a minha pergunta é bastante clara e bastante diferente da outra, e duas grandes respostas aqui parece provar que; ) Além disso, você está realmente sugerindo que eu tive o cuidado de vincular a outra pergunta, mas sem ler a resposta aceita?
Cedric Martin

Respostas:

32

Antes de tudo, toda vez que você executa um comando, o shell faz um novo processo, independentemente de você executá-lo &ou não. &significa apenas que você está executando em segundo plano.

Observe que isso não é muito preciso. Alguns comandos, como cdsão funções de shell e geralmente não bifurcam um novo processo. type cmdnormalmente diz se cmdé um comando externo ou uma função shell. type typediz que em typesi é uma função shell.

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

Para responder sua pergunta, faça o seguinte:

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

Você notará que a emacsjanela está morta, apesar de ser executada em segundo plano. Esse é o comportamento padrão e nohupé usado com precisão para modificá-lo.

Executar um trabalho em segundo plano (com &ou bg, aposto que outros shells também têm outras sintaxes) é um recurso de shell, decorrente da capacidade dos sistemas modernos de realizar multitarefas. Em vez de bifurcação uma nova instância de shell para cada programa que você deseja iniciar, conchas modernas ( bash, zsh, ksh, ...) terá a capacidade de gerenciar uma lista de programas (ou empregos ). Apenas um deles por vez pode estar em primeiro plano , o que significa que ele obtém o foco do shell. Eu gostaria que alguém pudesse expandir mais as diferenças entre um processo em execução em primeiro plano e outro em segundo plano (o principal é o acesso a stdin/ stdout).

De qualquer forma, isso não afeta a maneira como o processo filho reage SIGHUP. nohupfaz.

rahmu
fonte
+1 para vocês duas pelas ótimas respostas ... Mas ainda estou confuso ... Tentei isso antes de responder à minha pergunta: talvez minha instalação (muito antiga) do Debian Linux não esteja configurada corretamente, mas se eu " "e digite" exit ", apenas o meu xterm sai: o emacs permanece lá.
Cedric Martin
O Emacs é complicado o suficiente para que ele possa lidar com o SIGHUP por conta própria. É apenas por padrão que os processos saem no SIGHUP. Muitos programas 'daemon', como ntpd ou inetd, relerão sua configuração no SIGHUP em vez de sair. Eu sou um cara vim, então não tenho muita experiência com nenhum emacs.
23612 Bruce Ediger
3
Não há nada de especial no emacs. Um shell normalmente envia SIGHUPpara seus processos filhos quando o próprio shell recebe SIGHUP, não quando o shell sai normalmente. O bash tem uma opção huponexitque faz com que seja enviado SIGHUPaos filhos quando sai, mas não está ativado por padrão. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson
Olá. Primeiro de tudo, ótima explicação. Tentei verificar sua tese executando um processo &e fechei meu shell executando exit. O processo ainda está em execução. Alguma idéia de por que não foi morto? Ou estou faltando alguma coisa aqui?
Ali Yılmaz
Qual é o processo que você está executando?
rahmu
16

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

Se o fizer nohup ... &, o nohupcomando define SIGHUP para ignorado e, em seguida, executa o comando. Esse comando recém-executado mantém a máscara de sinal nohupconfigurada, a menos que o comando faça algum tratamento de sinal. Se você fechar o xterm ou o rxvt ou o que for, o kernel entregará o SIGHUP ao processo do comando, que será ignorado. Ele continua correndo.

Executar um nohupcomando on permite que ele continue em execução após o fechamento do xterm ou o logoff.

Bruce Ediger
fonte
Desculpe - você me perdeu. Você está dizendo que usar &com nohupmantém o comando em execução em certos casos em que somente o uso nohupnão seria? Isso parece entrar em conflito com a resposta aqui: unix.stackexchange.com/a/288064/1822 #
Mike B
2
@MikeB - O "&" faz as chamadas usuais do sistema fork / set things / exec para colocar o comando "em segundo plano". Ou seja, o comando que não é armazenado em buffer está sendo executado de forma assíncrona. O nohupfaz algumas coisas antes da exec()chamada de sistema para tornar o processo bifurcada ignorar certos sinais. Portanto, sim, um "&" permitirá que um comando seja executado sob certas circunstâncias que um velho comum nohupnão faria. Como fechar o xterm associado ao shell que fez o nohup ou fazer logoff.
precisa
-1

se você executa um programa em segundo plano (com & como sufixo) no sistema operacional linux e efetua logout, mesmo depois disso, ele continuará em execução: tente com:

  ping google.com > ping_result  &

Após o login novamente, verifique o número de linhas no arquivo de saída ping_resultque continuará aumentando significa que ele ainda está sendo executado, mas foi informado que ele será fechado. então qual é o uso do nohupcomando.

outro cenário ==> conforme indicado acima para nohup emac &-> que deve continuar em emacexecução após o logout do sistema, mas não mostra a execução após o logon novamente.

aditya
fonte