Essa pergunta é antiga e ainda não estou claro sobre o porquê.
Pergunta original em 2014:
Na guia Terminal do Gnome, corri
$ nohup chromium-browser &
Mas quando fecho a aba terminal, chromium-browser
também sai. Não nohup
deveria impedir isso? Gilles disse:
pode-se dizer que nohup e repudiar ambos suprimem SIGHUP, mas de maneiras diferentes. nohup faz o programa ignorar o sinal inicialmente (o programa pode mudar isso). o nohup também tenta providenciar para que o programa não tenha um terminal de controle, para que ele não seja enviado SIGHUP pelo kernel quando o terminal estiver fechado. a renúncia é puramente interna à concha; faz com que o shell não envie SIGHUP quando terminar.
Então nohup não faz o navegador de cromo ignorar o SIGHUP?
Também estou vendo isso em outros executáveis, como o Emacs (modo GUI). Mas não em xeyes.
Isso está acontecendo no Ubuntu 12.04, 32 bits, quando a pergunta foi publicada.
Atualização em 2015,
Agora estou executando o Ubuntu 14.04, em google-chrome
vez de chromium-browser
instalado. A mesma coisa que aconteceu com o chromium-browser antes também acontece com o google-chrome agora. nohup google-chrome 2>/dev/null &
não impede que ele seja fechado quando a guia do terminal estiver fechada. /usr/bin/google-chrome
é um link para um script bash /opt/google/chrome/google-chrome
. Por que nohup
o script aplicado ao bash não funciona? Como podemos fazê-lo funcionar em scripts bash? E os scripts Python?
xeyes
.Respostas:
Quando você fecha uma janela do Terminal GNOME, um SIGHUP é enviado ao shell que estava sendo executado. O shell normalmente envia um SIGHUP para todos os grupos de processos que ele sabe que ele criou - mesmo os iniciados
nohup
- e depois sai. Se o shell forbash
, ele ignorará o envio de um SIGHUP para qualquer grupo de processos com o qual o usuário tenha marcadodisown
.A execução de um comando com
nohup
ignora SIGHUP, mas o processo pode mudar isso. Quando a disposição do SIGHUP para um processo é o padrão, se ele receber um SIGHUP, o processo será encerrado.O Linux fornece algumas ferramentas para examinar as configurações de sinal de um processo em execução.
O script de shell do navegador chromium faz um
exec
dos aplicativos compilados, portanto seu ID do processo permanece o mesmo. Então, para ver suas configurações de sinal, corrinohup chromium-browser &
e olhei/proc/$!/status
para ver a disposição do sinal.Esses são números hexadecimais. Isso mostra que o SIGHUP não é capturado e não é ignorado. Somente SIGPIPE (o 13º bit em SigIgn) é ignorado. Eu rastreei isso para o seguinte código :
Apesar do comentário, os sinais ignorados pelos pais não estão sendo ignorados. Um SIGHUP matará cromo.
A solução alternativa é fazer o que @ xx4h aponta: use o
disown
comando no bash para que, se o bash precisar sair, ele não envie SIGHUP aochromium-browser
grupo de processos. Você pode escrever uma função para fazer isso:fonte
trap "" 1
, isso faria com que o shell (e seus filhos) ignorassem o SIGHUP. Eu vou esclarecer isso.trap
comandos no wrapper de script de shell não impedem isso e a execuçãonohup
não pode impedir isso. Vou revisar minha resposta para refletir isso.Se
chromium-browser
for algo assimgoogle-chrome
, acho que o problema mais provável é quechromium-browser
nãochromium
é, mas é um invólucro de shell que inicializa o estado e entãoexec
schromium
.Na minha
google-chrome
instalação, o binário está realmente localizado/opt/google/chrome
e o wrapper in/usr/bin
é apenas um script de shell que configura muito ambiente a respeito dexdg-*
padrões e caminhos absolutos e similares antes de se substituir pelo binário apropriado.Nesse ponto, qualquer sinal que
nohup
possa ter sido inicialmente ignorado em nome do script que ele chamou como filho deixará de importar e, a menos que o script do wrapper tenha o cuidado de organizá-lo de outra forma (o que não é), o ctty será herdado.Tente
file /usr/bin/chromium-browser
verificar se é o shell-script que eu acho que é. Nesse caso, considere reescrevê-lo para melhor atender você.Posso dizer que apenas o
google-chrome 2>/dev/null &
mantém aberto para mim, mas não me lembro se esse é um resultado provável das modificações que fiz no script - foi há mais de um ano.fonte
chromium-browser
antes também acontecegoogle-chrome
agora. Eu não tenhochromium-browser
instalado.nohup google-chrome 2>/dev/null &
não impede que ele seja fechado quando a guia do terminal estiver fechada.google-chrome
é um script bash/opt/google/chrome/google-chrome
. Por que o nohup aplicado a um script bash não funciona? Como podemos fazê-lo funcionar em scripts bash? E os scripts Python?chrome
binário.exec
ochrome
binário atual ? Como modifico o script então? Aqui está o meu/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... Na parte superior,$HERE
é definido o valor dereadlink $0
(qual é o seu caminho de instalaçãogoogle-chrome
), mas/opt/google/chrome/chrome
é o binário - que é o que o script se substitui.exec
provavelmente. Você terminará com um pid extra (além de outros 1000) e um processo de espera, mas acho que essa é a extensão. Ou então você pode substituirexec
w /nohup
talvez. Tudo depende principalmente do quechrome
será tolerado - mas deve funcionar assim.O cromo parece especial.
nohup chromium-browser & disown
deve funcionar neste caso. Consulte também: /programming/11421810/nohup-doesnt-work-with-chromiumfonte
nohup chromium-browser &
que não funciona?