Processo java ainda sendo morto


11

Preciso executar um programa java nos servidores da minha universidade. Estou acessando remotamente através de seus servidores via ssh

Então eu usei o nohup assim:

nohup java -jar project.jar &

No entanto, quando eu sair e fechar o terminal, em seguida, logon novamente no servidor, meu processo está ausente / foi morto.


Tente redirecionar stdoute stderrpara alguns arquivos - seu processo pode ser interrompido por um sinal diferente de SIGHUP, ao tentar gravar em um terminal fechado stdout/ stderr. Por exemplo, adicione >/dev/null 2>&1ao seu comando antes de &assinar o trabalho.
Boris Burkov

1
O @Bob não deve ser necessário com nohup- a maioria das implementações fará isso por padrão, embora possa ser necessário redirecionar, stdinpor exemplo </dev/null.
Graeme

Respostas:


14

nohupapenas torne o programa imune SIGHUPe SIGQUITsinalizado. O shell moderno talvez envie outros sinais quando você sair da sua sessão, para que não haja garantia de que seu programa não seja morto, mesmo executando sob nohup.

A melhor solução é usar tmuxou screen, ou se você usar bash, pode tentar:

$ java -jar project.jar &
$ disown

Se você usar disown, precisará redirecionar manualmente, por exemplo, add</dev/null &>/dev/null
Graeme

@ Graeme: Acho que se não trabalharmos mais com o shell (basta executar o comando e sair), não há necessidade de redirecionar.
cuonglm

Tente ssh localhost 'sleep 10m & disown'. bashnão vai sair.
Graeme

Ok, parece sshque não sai se houver programas conectados ao terminal. No entanto, o acima é bom se você executar interativamente.
Graeme

As implementações de Linux (GNU coreutils e busybox) e BSD de nohupnão tornam o comando imune SIGQUIT, mas apenas para SIGHUP. Isso seria explicitamente contrário ao padrão e o AFAIK pode acontecer apenas no (algumas versões do?) Solaris.
mosvy

13

Ainda outra opção no lugar do (cronicamente disfuncional) nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

Isso efetivamente "daemoniza" o processo. Agora ele pertence ao init, portanto, nunca será HUP, seus fluxos de E / S são seguros e foram bifurcados em segundo plano.

Veja man setsidpara mais informações. Ao contrário de screenou tmux, este não é um programa que reivindica propriedade e continua sendo executado. Simplesmente inicia um programa em seu próprio grupo de processos .


Por que o nohup é disfuncional?
cpugeniusmv

@cpugeniusmv Tenho certeza de que é bom para alguma coisa, no entanto, não a achei confiável para uma finalidade que geralmente é recomendada: entrar em algum lugar, iniciar um processo e sair (bem como o OP). Acho que poderia ter sido mal utilizado, e talvez setsidseja um pouco mais à prova de idiotas dessa maneira. Ele pula uma etapa implícita nohup (tendo o processo re-criado pelo init como um órfão). nohupseria mais flexível se você quiser colocar o trabalho em primeiro plano mais tarde.
GOLDILOCKS

@ TAFKA'goldilocks 'Acho que o problema está em lidar com stdin, stdout e stderr, que não é realmente (mas parcialmente (!)) Tratado pelo nohup. Nohup faz seu trabalho principal muito bem, protegendo o processo do SIGHUP. Mas há muitas coisas que podem dar errado nos fluxos - ou, muito pior, às vezes dão errado, dependendo do tamanho do buffer. Eu diria que não nohup está errado, mas a expectativa do que o nohup faz.
Volker Siegel


-2

Tente executar o seu nohup com o redirecionamento STDOUT e STDERR para null:

nohup java -jar project.jar 2>&1 &

1
Você está redirecionando apenas o stderr para o stdout, o que não altera nada sobre como o nohup opera (ele redireciona ambos para nohup.out).
Gilles 'SO- stop be evil'

1
-1, acho que você quis dizer, nohup java -jar project.jar 2>/dev/null &mas obviamente não sabe o que está fazendo. Melhor ainda, também alimente stdin /dev/null.
precisa saber é o seguinte

@PlasmaPower aqui você tem seu +1. Tenha um bom dia :)
Boris Quiroz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.