Eu escrevi um aplicativo de servidor Java que é executado em uma solução Linux hospedada virtual padrão. O aplicativo é executado o tempo todo ouvindo conexões de soquete e criando novos manipuladores para elas. É uma implementação do lado do servidor para um aplicativo cliente-servidor.
A maneira como inicio é incluindo-o no script de inicialização rc.local do servidor. No entanto, uma vez iniciado, não sei como acessá-lo para interrompê-lo e, se quiser instalar uma atualização, tenho que reiniciar o servidor para reiniciar o aplicativo.
Em um PC com Windows, para esse tipo de aplicativo, posso criar um serviço do Windows e depois parar e iniciá-lo como quiser. Existe algo parecido em uma caixa do Linux para que, se eu iniciar esse aplicativo, eu possa pará-lo e reiniciá-lo sem fazer uma reinicialização completa do servidor.
Meu aplicativo é chamado WebServer.exe. Ele é iniciado na inicialização do servidor, incluindo-o no meu rc.local, como tal:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
Eu sou um pouco noob no Linux, então qualquer exemplo seria apreciado em qualquer post. No entanto, tenho SSH e acesso FTP completo à caixa para instalar as atualizações e o acesso a um painel do Plesk.
Uma solução simples é criar um script start.sh que execute Java através do nohup e armazene o PID em um arquivo:
Em seguida, seu script stop stop.sh lê o PID do arquivo e mata o aplicativo:
É claro que deixei de fora alguns detalhes, como verificar se o processo existe e remover
pid.txt
se você terminou.fonte
O script init do serviço Linux é armazenado em
/etc/init.d
. Você pode copiar e personalizar/etc/init.d/skeleton
arquivos e, em seguida, chamarconsulte http://www.ralfebert.de/blog/java/debian_daemon/ . É para o Debian (também para o Ubuntu), mas cabe mais distribuição.
fonte
Talvez não seja a melhor solução para dev-ops, mas boa para o uso geral de um servidor em uma LAN ou similar.
Use
screen
para executar o servidor e desconectar antes de sair, isso manterá o processo em execução e você poderá reconectá-lo a qualquer momento.Fluxo de trabalho:
Inicie uma tela:
screen
Inicie seu servidor:
java -jar minecraft-server.jar
Separar pressionando:
Ctl-a
,d
Anexar novamente:
screen -r
Mais informações aqui: https://www.gnu.org/software/screen/manual/screen.html
fonte
Outra alternativa, que também é bastante popular, é o Java Service Wrapper . Isso também é bastante popular na comunidade OSS.
fonte
Referindo-me também ao aplicativo Spring Boot como um serviço , eu escolheria a
systemd
versão, já que é a mais fácil, menos detalhada e melhor integrada às distribuições modernas (e até as não tão modernas como o CentOS 7.x).fonte
A maneira mais fácil é usar
supervisord
. Por favor, veja todos os detalhes aqui: http://supervisord.org/Mais informações:
/ubuntu/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485
https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
fonte
Aqui está um script de shell de amostra (certifique-se de substituir o nome MATH pelo nome do seu aplicativo):
fonte
No aplicativo Spring Boot como um serviço , posso recomendar o
supervisord
aplicativo baseado em Python . Veja essa pergunta de estouro de pilha para obter mais informações. É realmente simples de configurar.fonte
supervisord
é ótimo, para quem não sabe, permite serviços de monitoramento (que devem serforeground
- nãodaemonized
), ele irá, em seguida, serviços de reinício automático (e pode-mails quando reinicia ocorrer via plugins)Outras respostas fazem um bom trabalho fornecendo scripts e configurações personalizadas, dependendo da sua plataforma. Além desses, aqui estão os programas maduros para fins especiais que eu conheço:
fonte
Você pode usar o servidor Thrift ou o JMX para se comunicar com seu serviço Java.
fonte
No Guia de Referência do Spring Boot
Continue lendo para saber como proteger um serviço implantado.
Depois de fazer o que foi escrito, descobri que meu serviço falha ao iniciar com esta mensagem de erro nos logs: opção start-stop-daemon: unrecognized --no-close . E eu consegui corrigi-lo criando um arquivo de configuração
/var/myapp/myapp.conf
com o seguinte conteúdofonte
Estou tendo o aplicativo java Netty e quero executá-lo como um serviço com o systemd. Infelizmente, o aplicativo para independentemente do tipo que estou usando. No final, envolvi o java start na tela. Aqui estão os arquivos de configuração:
serviço
começar
a partir desse ponto você pode usar
systemctl [start|stop|status] service
.fonte
Para executar o código Java como daemon (serviço), você pode escrever o stub baseado em JNI.
http://jnicookbook.owsiak.org/recipe-no-022/
para um código de amostra baseado em JNI. Nesse caso, você daemoniza o código que foi iniciado como Java e o loop principal é executado em C. Mas também é possível colocar o loop de serviço principal, daemon dentro do Java.
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029
Divirta-se com JNI!
fonte
Você pode escrever um script de parada simples que cumprimente seu processo java, extraia o PID e chame kill nele. Não é chique, mas é direto. Algo assim pode ser útil para começar:
fonte
pkill nameofprocess
faz a mesma coisa?É possível executar a guerra como um serviço Linux, e você pode forçar seu arquivo pom.xml antes do empacotamento, pois algumas distribuições podem não ser reconhecidas no modo automático. Para fazer isso, adicione a seguinte propriedade dentro do plug-in spring-boot-maven-plugin.
Em seguida, configure seu init.d com:
e você poderá correr
Existem muitas outras opções que você pode encontrar na documentação do Spring Boot , incluindo o serviço Windows.
fonte