Como configurar bem o aplicativo Spring Boot empacotado como jar executável como um serviço no sistema linux? Essa abordagem é recomendada ou devo converter este aplicativo em guerra e instalar no Tomcat?
Atualmente, posso executar o aplicativo de inicialização Spring a partir da screen
sessão, o que é bom, mas requer inicialização manual após a reinicialização do servidor.
O que estou procurando é conselho / direção geral ou init.d
script de exemplo , se minha abordagem com o jar executável for adequada.
service
startup
init.d
spring-boot
MariuszS
fonte
fonte
Respostas:
O seguinte funciona para o springboot 1.3 e superior:
Como serviço init.d
O jar executável possui os comandos normais de início, parada, reinicialização e status. Ele também configurará um arquivo PID no diretório / var / run usual e efetuará login no diretório / var / log usual por padrão.
Você só precisa vincular seu jar no /etc/init.d assim
OU
Depois disso, você pode fazer o habitual
Em seguida, configure um link no nível de execução em que você deseja que o aplicativo inicie / pare na inicialização, se assim o desejar.
Como um serviço systemd
Para executar um aplicativo Spring Boot instalado em var / myapp, você pode adicionar o seguinte script em /etc/systemd/system/myapp.service:
Nota: caso você esteja usando este método, não se esqueça de tornar o arquivo jar executável (com chmod + x), caso contrário, ele falhará com o erro "Permissão negada".
Referência
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
fonte
<executable>true</executable>
ao meupom.xml
, mas o arquivo JAR empacotado não executa (..../myapp.jar ... cannot execute binary file
.)-Dspring.profiles.active=prod
esses serviços? Pergunta - stackoverflow.com/questions/31242291/…/etc/init.d stop
não está parando o aplicativo, está tentando iniciá-lo novamente.A seguir, é a maneira mais fácil de instalar um aplicativo Java como serviço de sistema no Linux.
Vamos supor que você esteja usando
systemd
(o que qualquer distribuição moderna atualmente faz):Primeiro, crie um arquivo de serviço
/etc/systemd/system
nomeado, por exemplo,javaservice.service
com este conteúdo:Em segundo lugar, notifique
systemd
o novo arquivo de serviço:e habilitá-lo, para que ele seja executado na inicialização:
Eventualmente, você pode usar os seguintes comandos para iniciar / parar seu novo serviço:
Desde que você esteja usando
systemd
, esta é a maneira mais não invasiva e limpa de configurar um aplicativo Java como serviço do sistema.O que eu mais gosto nessa solução é o fato de você não precisar instalar e configurar nenhum outro software. O envio
systemd
faz todo o trabalho para você e seu serviço se comporta como qualquer outro serviço do sistema. Agora, uso-o na produção há um tempo, em diferentes distros, e funciona como você esperaria.Outra vantagem é que, usando
/usr/bin/java
, você pode facilmente adicionarjvm
parâmetros, como-Xmx256m
.Leia também a
systemd
parte da documentação oficial do Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlfonte
[Unit]
seção, por exemploAfter=mysql.service
,Before=apache2.service
.Você também pode usar o supervisord, que é um daemon muito útil, que pode ser usado para controlar facilmente os serviços. Esses serviços são definidos por arquivos de configuração simples que definem o que executar com qual usuário em qual diretório e assim por diante, há um zilhão de opções. O supervisord possui uma sintaxe muito simples, portanto, é uma alternativa muito boa para escrever scripts de inicialização do SysV.
Aqui está um arquivo de configuração de supervisão simples para o programa que você está tentando executar / controlar. (coloque isso em /etc/supervisor/conf.d/yourapp.conf )
/etc/supervisor/conf.d/yourapp.conf
Para controlar o aplicativo, você precisará executar o supervisorctl , que apresentará um prompt onde você pode iniciar, parar, status do seu pacote.
CLI
Se o
supervisord
daemon já estiver em execução e você adicionou a configuração para seu serviço sem reiniciar o daemon, você pode simplesmente executar um comandoreread
eupdate
nosupervisorctl
shell.Isso realmente oferece todas as flexibilidades que você teria usando os scripts SysV Init, mas fáceis de usar e controlar. Dê uma olhada na documentação .
fonte
systemd
, incorporado às distribuições Linux mais atuais.Eu mesmo acabei de fazer isso, então o seguinte é onde estou tão longe em termos de um script de controlador de serviço init.d do CentOS. Até agora, está funcionando muito bem, mas não sou um hacker da Bash, por isso tenho certeza de que há espaço para melhorias;
Primeiro de tudo, eu tenho um script de configuração curto
/data/svcmgmt/conf/my-spring-boot-api.sh
para cada serviço, que define variáveis de ambiente.Estou usando o CentOS, portanto, para garantir que meus serviços sejam iniciados após a reinicialização do servidor, tenho um script de controle de serviço em
/etc/init.d/my-spring-boot-api
:Como você pode ver, isso chama o script de configuração inicial para configurar variáveis de ambiente e, em seguida, chama um script compartilhado que eu uso para reiniciar todos os meus serviços do Spring Boot. Esse script compartilhado é onde a carne de tudo isso pode ser encontrada:
Ao parar, ele tentará usar o Spring Boot Actuator para executar um desligamento controlado. No entanto, se o Actuator não estiver configurado ou falhar ao desligar dentro de um período de tempo razoável (eu dou 5 segundos, o que é realmente um pouco curto), o processo será interrompido.
Além disso, o script pressupõe que o processo java que executa o aplicativo será o único com "my-spring-boot-api.jar" no texto dos detalhes do processo. Essa é uma suposição segura no meu ambiente e significa que não preciso acompanhar os PIDs.
fonte
java -jar
. O restante do script ainda é necessário.Se você deseja usar o Spring Boot 1.2.5 com o Spring Boot Maven Plugin 1.3.0.M2, aqui está a solução:
Em seguida, compile como usual:
mvn clean package
faça um link simbólicoln -s /.../myapp.jar /etc/init.d/myapp
,chmod +x /etc/init.d/myapp
execute-o e inicie-oservice myapp start
(com o Ubuntu Server)fonte
1.3.0.M2
, mas recebi um erro ao tentar1.3.0.RC1
.springBoot { executable = true }
bloco.Eu sei que essa é uma pergunta mais antiga, mas eu queria apresentar outra maneira, que é o appassembler-maven-plugin . Aqui está a parte relevante do meu POM que inclui muitos valores de opções adicionais que consideramos úteis:
fonte
COMO UM SERVIÇO WINDOWS
Se você deseja que isso seja executado na máquina Windows, faça o download do winsw.exe em
Depois disso, renomeie-o para jar nome do arquivo (por exemplo: your-app .jar)
Agora crie um arquivo xml your-app.xml e copie o seguinte conteúdo para esse
Verifique se o exe e o xml junto com o jar estão na mesma pasta.
Após esse prompt de comando aberto, clique em Administrador e instale-o no serviço Windows.
Se falhar com
Em seguida, tente o seguinte:
é isso aí :) .
Para desinstalar o serviço no Windows
Para ver / executar / parar o serviço: win + re digite Ferramentas administrativas e selecione o serviço a partir dele. Em seguida, clique com o botão direito do mouse e escolha a opção - executar / parar
fonte
Meu script SysVInit para Centos 6 / RHEL (ainda não é o ideal). Este script requer ApplicationPidListener .
Fonte de
/etc/init.d/app
Arquivo de configuração de amostra
/etc/sysconfig/app
:fonte
Aqui está um script que implanta um jar executável como um serviço systemd.
Ele cria um usuário para o serviço e o arquivo .service e coloca o arquivo jar em / var, além de bloquear alguns privilégios básicos.
Exemplo:
fonte
Estou tentando criar aplicativos springboot que são apresentados como um shell script no estilo "init.d", com um aplicativo java compactado na parte final
Ligando esses scripts de /etc/init.d/spring-app para /opt/spring-app.jar e chmod'ing o jar para ser executável, é possível iniciar "/etc/init.d/spring-app "/etc/init.d/spring-app stop" e outras possibilidades, como status de trabalho
Presumivelmente, como os scripts no estilo init.d do springboot parecem ter as seqüências mágicas necessárias (como
# Default-Start: 2 3 4 5
), o chkconfig poderia adicioná-lo como um "serviço"Mas eu queria fazê-lo funcionar com o systemd
Para fazer esse trabalho, tentei muitos dos recebimentos nas outras respostas acima, mas nenhum deles funcionou para mim no Centos 7.2 com Springboot 1.3.
No final, descobri que o seguinte funcionou para mim, quando o link /etc/init.d também estava em vigor. Um arquivo semelhante ao abaixo deve ser instalado como
/usr/lib/systemd/system/spring-app.service
fonte
Acabei fazendo o serviço systemd para o layout WAR / JAR
Estou chamando java -jar porque é mais flexível. Tentei também colocar o ExecStart = spring-mvc.war, mas mesmo sendo executável, recebi 'Exec format error'
De qualquer forma, atualmente, o systemd está presente em todas as distros e oferece uma boa solução para redirecionar logs (o syserr é importante quando o serviço nem inicia o local do arquivo log4j estará vazio :)).
rsyslog - redireciona a entrada do syslog do aplicativo para uma pasta / arquivo específico
logrotate
logrotate gc
fonte
Nesta pergunta, a resposta de @PbxMan deve começar:
Executar um aplicativo Java como um serviço no Linux
Editar:
Existe outra maneira menos agradável de iniciar um processo na reinicialização, usando cron:
Isso funciona, mas não fornece uma interface agradável de iniciar / parar para o seu aplicativo. Você ainda pode simplesmente
kill
assim mesmo ...fonte
Eu não conheço uma maneira "padrão" simplificada de fazer isso com um aplicativo Java, mas é definitivamente uma boa idéia (você deseja se beneficiar dos recursos de manutenção e monitoramento do sistema operacional, se houver) . Está no roteiro fornecer algo do suporte da ferramenta Spring Boot (maven e gradle), mas por enquanto você provavelmente precisará rolar o seu próprio. A melhor solução que conheço agora é o Foreman , que possui uma abordagem declarativa e comandos de uma linha para empacotar scripts init para vários formatos padrão de SO (monit, sys V, upstart etc.). Também há evidências de pessoas configurando coisas com gradle (por exemplo, aqui ).
fonte
Você está usando o Maven? Então você deve tentar o AppAssembler Plugin:
Veja: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
fonte
A seguinte configuração é necessária no arquivo build.gradle nos projetos do Spring Boot.
build.gradle
Isso é necessário para criar jar totalmente executável no sistema unix (Centos e Ubuntu)
Crie um arquivo .conf
Se você deseja configurar propriedades personalizadas da JVM ou argumentos de execução do aplicativo Spring Boot, é possível criar um arquivo .conf com o mesmo nome que o nome do aplicativo Spring Boot e colocá-lo paralelo ao arquivo jar.
Considerando que your-app.jar é o nome do seu aplicativo Spring Boot, você pode criar o seguinte arquivo.
Essa configuração definirá 64 MB de RAM para o aplicativo Spring Boot e ativará o perfil do produto.
Crie um novo usuário no linux
Para maior segurança, precisamos criar um usuário específico para executar o aplicativo Spring Boot como um serviço.
Crie um novo usuário
No Ubuntu / Debian, modifique o comando acima da seguinte maneira:
Configurar senha
Tornar o springboot o proprietário do arquivo executável
Impedir a modificação do arquivo jar
Isso configurará as permissões do jar para que ele não possa ser gravado e só possa ser lido ou executado por seu proprietário, springboot.
Opcionalmente, você pode tornar seu arquivo jar imutável usando o comando change attribute (chattr).
Permissões apropriadas também devem ser definidas para o arquivo .conf correspondente. .conf requer apenas acesso de leitura (Octal 400) em vez de acesso de leitura + execução (Octal 500)
Criar serviço Systemd
/etc/systemd/system/your-app.service
Reinicie o processo automaticamente se for morto pelo sistema operacional
Anexe os dois atributos abaixo (Reiniciar e RestartSec) para reiniciar automaticamente o processo em caso de falha.
/etc/systemd/system/your-app.service
A alteração fará com que o aplicativo Spring Boot seja reiniciado em caso de falha com um atraso de 30 segundos. Se você parar o serviço usando o comando systemctl, a reinicialização não ocorrerá.
Agendar serviço na inicialização do sistema
Para sinalizar o aplicativo para iniciar automaticamente na inicialização do sistema, use o seguinte comando:
Habilitar o aplicativo Spring Boot na inicialização do sistema
Iniciar uma parada do serviço
O systemctl pode ser usado no Ubuntu 16.04 LTS e 18.04 LTS para iniciar e parar o processo.
Iniciar o processo
Pare o processo
Referências
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
fonte
Seguindo a excelente resposta do Chade, se você receber um erro de "Erro: Não foi possível encontrar ou carregar a classe principal" - e você passar algumas horas tentando solucionar o problema, esteja executando um script de shell que inicia seu aplicativo java ou inicie-o do próprio systemd - e você sabe que seu caminho de classe está 100% correto, por exemplo, executar manualmente o shell script funciona bem como executar o que você possui no systemd execstart. Verifique se você está executando as coisas como o usuário correto! No meu caso, eu tentei usuários diferentes, depois de um tempo de solução de problemas - eu finalmente tive um palpite, coloquei root como usuário - pronto, o aplicativo foi iniciado corretamente. Depois de determinar que era um problema errado do usuário, eu
chown -R user:user
a pasta e as subpastas e o aplicativo foram executados corretamente como o usuário e o grupo especificados, não sendo mais necessário executá-lo como raiz (segurança ruim).fonte
Nos arquivos da unidade systemd, você pode definir o diretório de variáveis de ambiente ou através de um
EnvironmentFile
. Eu proporia fazer as coisas dessa maneira, pois parece ser a menor quantidade de atrito.Arquivo de unidade de amostra
Em seguida, configure um arquivo no
/etc/sysconfig/hello-world
qual inclua nomes em maiúsculas de suas variáveis do Spring Boot Por exemplo, uma variável chamadaserver.port
seguiria o formulárioSERVER_PORT
como uma variável de ambiente:O mecanismo que está sendo explorado aqui é que os aplicativos Spring Boot pegarão a lista de propriedades e as converterão, colocando tudo em maiúsculas e substituindo pontos por sublinhados. Depois que o aplicativo Spring Boot passa por esse processo, ele procura variáveis de ambiente que correspondam e usa as encontradas de acordo.
Isso é destacado em mais detalhes nesta SO Q&A intitulada: Como definir uma propriedade Spring Boot com um sublinhado em seu nome por meio de variáveis de ambiente?
Referências
fonte
Isso pode ser feito usando o serviço Systemd no Ubuntu
Você pode seguir este link para obter uma descrição mais elaborada e diferentes maneiras de fazer isso. http://www.baeldung.com/spring-boot-app-as-a-service
fonte
Crie um script com o nome your-app.service (rest-app.service). Devemos colocar esse script no diretório / etc / systemd / system. Aqui está o conteúdo de amostra do script
Próximo:
Referências
insira a descrição do link aqui
fonte