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?
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 .
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.
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 &
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.
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.
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.
shutdown
deve ser evitado como um termo com um significado específico do Linux. e substituído porexit
.Respostas:
nohup
captura o sinal de interrupção (vejaman 7 signal
) enquanto oe comercial não (exceto que o shell é confgurado dessa maneira ou não é enviadoSIGHUP
).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 usarnohup
, 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 hupon
para 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
nohup
que não funciona, por exemplo, quando o processo que você inicia reconecta oSIGHUP
sinal, como é o caso aqui .fonte
&
faz com que o subcomando não receba alguns sinais (por exemplo, SIGINT).nohup
essencialmente adicionaSIGHUP
à lista de sinais que não são propagados.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 oHUP
sinal e, portanto, mesmo que o shell atual seja encerrado, o subshell emyprocess.out
continuará 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 paranohup.out
ou$HOME/nohup.out
.fonte
myprocess.out &
e saio do shell. No entanto, quando eu usops aux | grep myprocess.out
em outro shell, ainda consigo encontrar "myprocess.out". Isso significa que o processo ainda está em execução, não será encerrado.kill -9
não haverá um SIGHUP, pois isso exigiria que o shell pai lidasse com SIGKILL, o que não pode.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 captura os sinais HUP. Nohup não coloca o trabalho automaticamente em segundo plano. Precisamos dizer isso explicitamente usando &
fonte
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.
fonte
Corrija-me se eu estiver errado
nohup capta o sinal de interrupção , o que significa que enviará um processo quando o terminal estiver fechado.
O processo pode ser executado, mas será interrompido quando o terminal for fechado.
Processo capaz de executar até o terminal fechado, mas você pode parar o processo pressionando
ctrl
+z
no terminal.Crt
+z
não funciona se&
existir.fonte
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.
fonte
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?
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:
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.
fonte