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'?
nohup
faz. Que parte você confundiu?Respostas:
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
cd
são funções de shell e geralmente não bifurcam um novo processo.type cmd
normalmente diz secmd
é um comando externo ou uma função shell.type type
diz que emtype
si é uma função shell.nohup
é algo diferente. Diz ao novo processo para ignorarSIGHUP
. É o sinal enviado pelo kernel quando o shell principal é fechado.Para responder sua pergunta, faça o seguinte:
emacs &
(por padrão, deve ser executado em uma janela X separada) .exit
.Você notará que a
emacs
janela está morta, apesar de ser executada em segundo plano. Esse é o comportamento padrão enohup
é usado com precisão para modificá-lo.Executar um trabalho em segundo plano (com
&
oubg
, 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 astdin
/stdout
).De qualquer forma, isso não afeta a maneira como o processo filho reage
SIGHUP
.nohup
faz.fonte
SIGHUP
para seus processos filhos quando o próprio shell recebeSIGHUP
, não quando o shell sai normalmente. O bash tem uma opçãohuponexit
que faz com que seja enviadoSIGHUP
aos filhos quando sai, mas não está ativado por padrão. gnu.org/software/bash/manual/bashref.html#Signals&
e fechei meu shell executandoexit
. O processo ainda está em execução. Alguma idéia de por que não foi morto? Ou estou faltando alguma coisa aqui?É 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 ... &
, onohup
comando define SIGHUP para ignorado e, em seguida, executa o comando. Esse comando recém-executado mantém a máscara de sinalnohup
configurada, 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
nohup
comando on permite que ele continue em execução após o fechamento do xterm ou o logoff.fonte
&
comnohup
mantém o comando em execução em certos casos em que somente o usonohup
não seria? Isso parece entrar em conflito com a resposta aqui: unix.stackexchange.com/a/288064/1822 #nohup
faz algumas coisas antes daexec()
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 comumnohup
não faria. Como fechar o xterm associado ao shell que fez o nohup ou fazer logoff.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:
Após o login novamente, verifique o número de linhas no arquivo de saída
ping_result
que continuará aumentando significa que ele ainda está sendo executado, mas foi informado que ele será fechado. então qual é o uso donohup
comando.outro cenário ==> conforme indicado acima para
nohup emac &
-> que deve continuar ememac
execução após o logout do sistema, mas não mostra a execução após o logon novamente.fonte