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.
stdout
estderr
para alguns arquivos - seu processo pode ser interrompido por um sinal diferente de SIGHUP, ao tentar gravar em um terminal fechadostdout
/stderr
. Por exemplo, adicione>/dev/null 2>&1
ao seu comando antes de&
assinar o trabalho.nohup
- a maioria das implementações fará isso por padrão, embora possa ser necessário redirecionar,stdin
por exemplo</dev/null
.Respostas:
nohup
apenas torne o programa imuneSIGHUP
eSIGQUIT
sinalizado. 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 sobnohup
.A melhor solução é usar
tmux
ouscreen
, ou se você usarbash
, pode tentar:fonte
disown
, precisará redirecionar manualmente, por exemplo, add</dev/null &>/dev/null
ssh localhost 'sleep 10m & disown'
.bash
não vai sair.ssh
que não sai se houver programas conectados ao terminal. No entanto, o acima é bom se você executar interativamente.nohup
não tornam o comando imuneSIGQUIT
, mas apenas paraSIGHUP
. Isso seria explicitamente contrário ao padrão e o AFAIK pode acontecer apenas no (algumas versões do?) Solaris.Ainda outra opção no lugar do (cronicamente disfuncional)
nohup
: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 setsid
para mais informações. Ao contrário descreen
outmux
, este não é um programa que reivindica propriedade e continua sendo executado. Simplesmente inicia um programa em seu próprio grupo de processos .fonte
setsid
seja 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).nohup
seria mais flexível se você quiser colocar o trabalho em primeiro plano mais tarde.Outra idéia seria usar o comando screen. É possível iniciar um programa com tela, desconectar e sair. Depois, você pode efetuar login e anexar à sessão da tela em execução.
Tutorial: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
fonte
Tente executar o seu nohup com o redirecionamento STDOUT e STDERR para null:
fonte
nohup.out
).nohup java -jar project.jar 2>/dev/null &
mas obviamente não sabe o que está fazendo. Melhor ainda, também alimentestdin
/dev/null
.