Qual é a diferença entre nohup e e comercial

242

Ambos nohup myprocess.out &ou myprocess.out &defina myprocess.out para executar em segundo plano. Depois de desligar o terminal, o processo ainda está em execução. Qual a diferença entre eles?

Yarkee
fonte
qual shell você está usando? o comportamento varia entre conchas
shx2
1
bash. E eu sei por que agora, de acordo com a resposta do @nemo.
Yarkee
@Yarkee, se a resposta corresponder ao seu problema, marque a pergunta como aceita (a caixa de seleção abaixo dos votos da resposta) para que não fique como não respondida. Você deve fazê-lo para todas as suas perguntas :) #
21
1
shutdowndeve ser evitado como um termo com um significado específico do Linux. e substituído por exit.
Patrizio Bertoni

Respostas:

316

nohupcaptura o sinal de interrupção (veja man 7 signal) enquanto oe comercial não (exceto que o shell é confgurado dessa maneira ou não é enviado SIGHUP).

Normalmente, ao executar um comando usando &e saindo do shell posteriormente, o shell finaliza o subcomando com o sinal de interrupção ( kill -SIGHUP <pid>). Isso pode ser impedido de usar nohup, pois captura o sinal e o ignora para que nunca atinja a aplicação real.

Caso esteja usando o bash, você pode usar o comando shopt | grep huponpara descobrir se o seu shell envia o SIGHUP para os processos filhos ou não. Se estiver desativado, os processos não serão encerrados, como parece ser o seu caso. Mais informações sobre como o bash encerra aplicativos podem ser encontradas aqui .

Há casos em nohupque não funciona, por exemplo, quando o processo que você inicia reconecta o SIGHUPsinal, como é o caso aqui .

nemo
fonte
Pode-se notar que apenas &faz com que o subcomando não receba alguns sinais (por exemplo, SIGINT). nohupessencialmente adiciona SIGHUPà lista de sinais que não são propagados.
studgeek
46

myprocess.out &executaria o processo em segundo plano usando um subshell. Se o shell atual for encerrado (digamos, logout), todos os subshells também serão encerrados, para que o processo em segundo plano também seja encerrado. O comando nohup ignora o HUPsinal e, portanto, mesmo que o shell atual seja encerrado, o subshell e myprocess.outcontinuará sendo executado em segundo plano. Outra diferença é que, por &si só, não redireciona o stdout / stderr; portanto, se houver alguma saída ou erro, eles serão exibidos no terminal. por outro lado, redirecione o stdout / stderr para nohup.outou $HOME/nohup.out.

amit_g
fonte
6
Eu corro myprocess.out &e saio do shell. No entanto, quando eu uso ps aux | grep myprocess.outem outro shell, ainda consigo encontrar "myprocess.out". Isso significa que o processo ainda está em execução, não será encerrado.
Yarkee
1
@amit_g Ao matar o shell pai com kill -9não haverá um SIGHUP, pois isso exigiria que o shell pai lidasse com SIGKILL, o que não pode.
31
2
Verifique shopt | grep hupon como mencionado na outra resposta.
31513 amit_g
31

Na maioria das vezes, fazemos login no servidor remoto usando o ssh. Se você iniciar um script de shell e efetuar logout, o processo será encerrado. O Nohup ajuda a continuar executando o script em segundo plano, mesmo após o logout do shell.

Nohup command name &
eg: nohup sh script.sh &

Nohup captura os sinais HUP. Nohup não coloca o trabalho automaticamente em segundo plano. Precisamos dizer isso explicitamente usando &

missgeorge
fonte
Obrigado. Não esperava sua resposta, mas o fato de ela estar aqui é ótimo. Responde à pergunta que não fiz: D
Vaibhav Kaushal
26

O uso do e comercial (&) executará o comando em um processo filho (filho na sessão atual do bash). No entanto, quando você sai da sessão, todos os processos filhos serão eliminados.

o uso de nohup + e comercial (&) fará a mesma coisa, exceto quando a sessão terminar, o pai do processo filho será alterado para "1", que é o processo "init", impedindo que o filho seja morto.

Michel
fonte
7

Corrija-me se eu estiver errado

  nohup myprocess.out &

nohup capta o sinal de interrupção , o que significa que enviará um processo quando o terminal estiver fechado.

 myprocess.out &

O processo pode ser executado, mas será interrompido quando o terminal for fechado.

nohup myprocess.out

Processo capaz de executar até o terminal fechado, mas você pode parar o processo pressionando ctrl+ zno terminal. Crt+ znão funciona se &existir.

John Joe
fonte
2

O comando nohup é um utilitário de mascaramento de sinal e captura o sinal de desligamento. Onde e comercial não capta os sinais de desligamento. O shell encerrará o subcomando com o sinal de desligamento ao executar um comando usando & e saindo do shell. Isso pode ser evitado usando nohup, pois captura o sinal. O comando Nohup aceita o sinal de desligamento que pode ser enviado a um processo pelo kernel e bloqueá-lo. O comando Nohup é útil quando um usuário deseja iniciar o logoff de aplicativos de execução longa ou fechar a janela em que o processo foi iniciado. Normalmente, uma dessas ações solicita que o kernel desligue o aplicativo, mas um wrapper nohup permitirá que o processo continue. O uso do e comercial executará o comando em um processo filho e este filho da sessão atual do bash. Quando você sai da sessão, todos os processos filhos desse processo serão mortos. Oe comercial refere-se ao controle do trabalho para o shell ativo. Isso é útil para executar um processo em uma sessão em segundo plano.

santosh
fonte
0

Existem muitos casos em que pequenas diferenças entre ambientes podem morder você. Este é um no qual eu corri recentemente. Qual é a diferença entre esses dois comandos?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

A resposta é a mesma de sempre - depende.

nohup capta o sinal de desligamento enquanto oe comercial não.

Qual é o sinal de desligamento?

SIGHUP - hangup detectado no terminal de controle ou morte do processo de controle (valor: 1).

Normalmente, ao executar um comando usando & e saindo do shell posteriormente, o shell finaliza o subcomando com o sinal de desligamento (como kill -SIGHUP $ PID). Isso pode ser evitado usando nohup, pois ele captura o sinal e o ignora para que ele nunca atinja o aplicativo real.

Tudo bem, mas como neste caso, sempre existem 'mas'. Não há diferença entre esses métodos de inicialização quando o shell é configurado de uma maneira que não envia SIGHUP.

Caso esteja usando o bash, você pode usar o comando especificado abaixo para descobrir se o seu shell envia o SIGHUP para seus processos filhos ou não:

~ $ shopt | grep hupon

Além disso - há casos em que o nohup não funciona. Por exemplo, quando o processo iniciado reconecta o sinal NOHUP (feito dentro, no nível do código do aplicativo).

No caso descrito, a falta de diferenças me incomodou quando, dentro de um script de inicialização de serviço personalizado, havia uma chamada para um segundo script que configura e inicia o aplicativo apropriado sem um comando nohup.

Em um ambiente Linux, tudo funcionou perfeitamente; em um segundo, o aplicativo foi encerrado assim que o segundo script foi encerrado (detectando esse caso, é claro que me levou muito mais tempo do que você imagina: stuck_out_tongue :).

Após adicionar nohup como método de inicialização ao segundo script, o aplicativo continuará sendo executado mesmo que os scripts sejam encerrados e esse comportamento se torne consistente nos dois ambientes.

Devender Goyal
fonte