Execute o arquivo java jar em um servidor como processo em segundo plano

105

Preciso executar um jar java no servidor para me comunicar entre dois aplicativos. Eu escrevi dois scripts de shell para executá-lo, mas depois que inicio esse script, não consigo encerrar / encerrar o processo. Se eu pressionar ctrl+ Cou fechar o console, o servidor será encerrado. Alguém poderia me ajudar como modificar este script para funcionar como um servidor normal?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid
Bernad Ali
fonte

Respostas:

242

Você pode tentar isto:

#!/bin/sh
nohup java -jar /web/server.jar &

O símbolo & muda a execução do programa em segundo plano.

O utilitário nohup faz com que o comando passado como um argumento seja executado em segundo plano, mesmo após o logout.

Anton Beloglazov
fonte
Obrigado Anton, atualmente estou parando o servidor eliminando o id do processo. Não acho que seja a melhor prática. Este é o comando para parar o servidor?
Bernad Ali
3
Resposta curta: depende do servidor. Resposta longa: até onde eu sei, não há maneira segura de encerrar um processo sem que o processo apoie encerramentos tão elegantes. Por exemplo, se for um servidor web sendo encerrado por um sinal externo, sempre existe a possibilidade de que algumas solicitações sejam perdidas. Uma maneira de resolver esse problema é implementar uma função de encerramento normal no próprio servidor, por exemplo, processando um tipo especial de solicitações. Em seguida, o servidor pode ser encerrado enviando-lhe uma solicitação desse tipo especial. Caso contrário, matar o processo por seu ID é a maneira mais simples.
Anton Beloglazov
1
O uso nohupdeve sempre ser combinado com o redirecionamento de stdout e stderr explicitamente - caso contrário, você não terá controle de para onde vão os logs e acabará com um feio nohup.outcriado em qualquer diretório de onde esse script seja invocado.
Charles Duffy
@Anton quando executo um script (assim como sua resposta) com SSH EXEC runjar.sh. Ele começou a transmitir os logs em meu terminal local e, se fechar meu terminal, meu jar é morto. Como posso executar um jar em segundo plano usando SSH EXEC?
AATHITH RAJENDRAN
47

Systemd que agora roda na maioria das distros

Passo 1:

Encontre seus serviços definidos pelo usuário, os meus estavam em /usr/lib/systemd/system/

Passo 2:

Crie um arquivo de texto com o nome do seu editor de texto favorito whatever_you_want.service

Etapa 3:

Coloque o seguinte modelo no arquivowhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Passo 4:

Execute seu serviço
como superusuário

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service
mtelesha
fonte
Esta é a maneira moderna de fazer isso
EarthMind
4
no aws ubutnu image Eu tive que instalar o systemd, então encontrei a imagem em / etc / systemd / system /
Robbo_UK
29

Se você estiver usando o Ubuntu e tiver "Upstart" ( http://upstart.ubuntu.com/ ), você pode tentar isso:

Crio /var/init/yourservice.conf

com o seguinte conteúdo

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Agora você pode emitir os comandos service yourservice starte service yourservice stop. Você pode /var/log/yourservice.logverificar se está funcionando.

Se você deseja apenas executar o jar a partir do console, sem ocupar a janela do console, basta fazer:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
fonte
3
Isso é um serviço systemd? Esta questão não é linux marcada, e muito poucas distros têm o systemd por padrão.
jordanm
1
Vou corrigir a questão para dizer que isso está usando "upstart", que está incluído no ubuntu.
Strelok
1
Acredito que para o último conselho, se você quiser que ele seja executado em segundo plano e o shell foi liberado, você deve fazer: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Todos os trabalhos do sistema, por padrão, estão no seguinte diretório: / etc / init / ... Por padrão, não há diretório / var / init / no Ubuntu 14.04.
Michael Lafayette,
Além disso, iniciar um serviço requer "sudo". serviço sudo início de serviço seu
Michael Lafayette,
2

Execute em segundo plano e adicione logs ao arquivo de log usando o seguinte:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
fonte