¿Cómo configurar bien la aplicación Spring Boot empaquetada como jar ejecutable como un Servicio en un sistema Linux? ¿Es este enfoque recomendado o debería convertir esta aplicación a war e instalarla en Tomcat?
Actualmente puedo ejecutar la aplicación de arranque Spring desde la screen
sesión, lo que es bueno, pero requiere un inicio manual después del reinicio del servidor.
Lo que estoy buscando es asesoramiento general / dirección o init.d
script de muestra , si mi enfoque con jar ejecutable es correcto.
service
startup
init.d
spring-boot
MariuszS
fuente
fuente
Respuestas:
Lo siguiente funciona para springboot 1.3 y superior:
Como servicio init.d
El jar ejecutable tiene los comandos habituales de inicio, detención, reinicio y estado. También configurará un archivo PID en el directorio habitual / var / run e iniciará sesión en el directorio habitual / var / log de forma predeterminada.
Solo necesita vincular su jar en /etc/init.d así
O
Después de eso puedes hacer lo habitual
Luego, configure un enlace en el nivel de ejecución en el que desee que la aplicación se inicie / pare en el arranque si así lo desea.
Como un servicio systemd
Para ejecutar una aplicación Spring Boot instalada en var / myapp, puede agregar el siguiente script en /etc/systemd/system/myapp.service:
NB: en caso de que esté utilizando este método, no olvide hacer que el archivo jar sea ejecutable (con chmod + x) de lo contrario fallará con el error "Permiso denegado".
Referencia
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
fuente
<executable>true</executable>
a mipom.xml
, pero el archivo JAR envasados no ejecuta (..../myapp.jar ... cannot execute binary file
.)-Dspring.profiles.active=prod
a estos servicios? Pregunta - stackoverflow.com/questions/31242291/…/etc/init.d stop
no está deteniendo la aplicación, está intentando iniciarla nuevamente.Lo que sigue es la forma más fácil de instalar una aplicación Java como servicio del sistema en Linux.
Supongamos que está utilizando
systemd
(lo que cualquier distribución moderna hace hoy en día):En primer lugar, cree un archivo de servicio en
/etc/systemd/system
nombre, por ejemplo,javaservice.service
con este contenido:En segundo lugar, notificar
systemd
el nuevo archivo de servicio:y habilitarlo, para que se ejecute en el arranque:
Eventualmente, puede usar los siguientes comandos para iniciar / detener su nuevo servicio:
Siempre que estés usando
systemd
, esta es la forma más no intrusiva y limpia de configurar una aplicación Java como servicio del sistema.Lo que me gusta especialmente de esta solución es el hecho de que no necesita instalar y configurar ningún otro software. El enviado
systemd
hace todo el trabajo por usted y su servicio se comporta como cualquier otro servicio del sistema. Lo uso en producción desde hace un tiempo, en diferentes distribuciones, y funciona como es de esperar.Otra ventaja es que, al usar
/usr/bin/java
, puede agregar fácilmentejvm
parámetros como-Xmx256m
.Lea también la
systemd
parte en la documentación oficial de Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.htmlfuente
[Unit]
sección, por ejemploAfter=mysql.service
,Before=apache2.service
.También podría usar supervisor, que es un demonio muy útil, que puede usarse para controlar fácilmente los servicios. Estos servicios se definen mediante simples archivos de configuración que definen qué ejecutar con qué usuario en qué directorio, etc., hay un montón de opciones. supervisord tiene una sintaxis muy simple, por lo que es una muy buena alternativa para escribir scripts de inicio SysV.
Aquí hay un archivo de configuración de supervisor simple para el programa que está intentando ejecutar / controlar. (poner esto en /etc/supervisor/conf.d/yourapp.conf )
/etc/supervisor/conf.d/yourapp.conf
Para controlar la aplicación, necesitará ejecutar supervisorctl , que le presentará un mensaje donde puede iniciar, detener y el estado de su aplicación.
CLI
Si el
supervisord
demonio ya se está ejecutando y que ha añadido la configuración para su serivce sin necesidad de reiniciar el demonio que puede hacer un simplereread
yupdate
comando en elsupervisorctl
shell.Esto realmente le brinda todas las flexibilidades que tendría utilizando los scripts de SysV Init, pero fáciles de usar y controlar. Echa un vistazo a la documentación .
fuente
systemd
, que está integrado en la mayoría de las distribuciones de Linux actuales.Acabo de hacer esto yo mismo, así que lo siguiente es donde estoy hasta ahora en términos de un script de controlador de servicio CentOS init.d. Hasta ahora está funcionando bastante bien, pero no soy un hacker de Bash, así que estoy seguro de que hay margen de mejora, por lo que las ideas para mejorarlo son bienvenidas.
En primer lugar, tengo un script de configuración corto
/data/svcmgmt/conf/my-spring-boot-api.sh
para cada servicio, que configura las variables de entorno.Estoy usando CentOS, por lo que para garantizar que mis servicios se inicien después de reiniciar el servidor, tengo un script de control de servicio en
/etc/init.d/my-spring-boot-api
:Como puede ver, eso llama al script de configuración inicial para configurar variables de entorno y luego llama a un script compartido que uso para reiniciar todos mis servicios Spring Boot. Ese script compartido es donde se puede encontrar la esencia de todo:
Al detenerse, intentará usar el actuador Spring Boot para realizar un apagado controlado. Sin embargo, en caso de que el Actuador no esté configurado o no se apague dentro de un período de tiempo razonable (le doy 5 segundos, lo cual es un poco corto en realidad), el proceso se cancelará.
Además, el script supone que el proceso de Java que ejecuta la aplicación será el único con "my-spring-boot-api.jar" en el texto de los detalles del proceso. Esta es una suposición segura en mi entorno y significa que no necesito hacer un seguimiento de los PID.
fuente
java -jar
. El resto del guión todavía es necesario.Si desea usar Spring Boot 1.2.5 con Spring Boot Maven Plugin 1.3.0.M2, aquí está nuestra solución:
Luego compile como ususal:
mvn clean package
haga un enlace simbólicoln -s /.../myapp.jar /etc/init.d/myapp
, hágalo ejecutablechmod +x /etc/init.d/myapp
e inícieloservice myapp start
(con Ubuntu Server)fuente
1.3.0.M2
, pero recibí un error cuando lo intenté1.3.0.RC1
.springBoot { executable = true }
block.Sé que esta es una pregunta anterior, pero quería presentar otra forma más, que es el complemento appassembler-maven-plugin . Aquí está la parte relevante de mi POM que incluye muchos valores de opciones adicionales que encontramos útiles:
fuente
COMO SERVICIO DE VENTANAS
Si desea que esto se ejecute en la máquina de Windows, descargue el winsw.exe de
Después de eso, cámbiele el nombre a nombre de archivo jar (por ejemplo: your-app .jar)
Ahora cree un archivo xml your-app.xml y copie el siguiente contenido
Asegúrese de que el exe y xml junto con jar en una misma carpeta.
Después de este símbolo del sistema abierto en el administrador anterior e instalarlo en el servicio de Windows.
Si falla con
Luego intente lo siguiente:
Eso es :) .
Para desinstalar el servicio en windows
Para ver / ejecutar / detener el servicio: win + r y escriba Herramientas administrativas, luego seleccione el servicio de eso. Luego, haga clic con el botón derecho en la opción: ejecutar / detener
fuente
Mi script SysVInit para Centos 6 / RHEL (todavía no es ideal). Este script requiere ApplicationPidListener .
Fuente de
/etc/init.d/app
Archivo de configuración de muestra
/etc/sysconfig/app
:fuente
Aquí hay un script que implementa un jar ejecutable como un servicio systemd.
Crea un usuario para el servicio y el archivo .service, y coloca el archivo jar en / var, y realiza un bloqueo básico de privilegios.
Ejemplo:
fuente
Estoy tratando de hacer aplicaciones Springboot que se presentan como un script de shell de estilo "init.d" con una aplicación Java comprimida añadida al final
Al vincular estos scripts de /etc/init.d/spring-app a /opt/spring-app.jar y modificar el jar para que sea ejecutable, es posible hacer que "/etc/init.d/spring-app start "" /etc/init.d/spring-app stop "y otras posibilidades como el trabajo de estado
Presumiblemente, como las secuencias de comandos de estilo init.d de springboot parecen tener las necesarias cadenas mágicas (como
# Default-Start: 2 3 4 5
) chkconfig podría agregarlo como un "servicio"Pero quería que funcionara con systemd
Para que esto funcione, probé muchas de las respuestas en las otras respuestas anteriores, pero ninguna de ellas funcionó para mí. en Centos 7.2 con Springboot 1.3. Principalmente iniciarían el servicio pero no podrían rastrear el pid
Al final, descubrí que lo siguiente funcionó para mí, cuando el enlace /etc/init.d también estaba en su lugar. Un archivo similar al siguiente se debe instalar como
/usr/lib/systemd/system/spring-app.service
fuente
Terminé haciendo el servicio systemd para el diseño WAR / JAR
Llamo a java -jar porque es más flexible. Intenté también poner ExecStart = spring-mvc.war pero aunque es ejecutable, recibí 'Error de formato de Exec'
De todos modos en estos días, systemd está presente en todas las distribuciones, y ofrece una buena solución para redirigir los registros (syserr es importante cuando su servicio ni siquiera inicia, la ubicación del archivo log4j estará vacía :)).
rsyslog: redirige la entrada de syslog de la aplicación a una carpeta / archivo específico
rotar
logrotate gc
fuente
En esta pregunta, la respuesta de @PbxMan debería ayudarlo a comenzar:
Ejecute una aplicación Java como servicio en Linux
Editar:
Hay otra forma menos agradable de comenzar un proceso al reiniciar, usando cron:
Esto funciona, pero no ofrece una interfaz agradable de inicio / detención para su aplicación. Todavía puedes simplemente
kill
hacerlo de todos modos ...fuente
No conozco una forma "estándar" de reducir la forma de hacer eso con una aplicación Java, pero definitivamente es una buena idea (si quieres, puedes beneficiarte de las capacidades de mantenimiento y monitoreo del sistema operativo). . Está en la hoja de ruta para proporcionar algo del soporte de la herramienta Spring Boot (maven y gradle), pero por ahora probablemente tendrá que rodar la suya. La mejor solución que conozco en este momento es Foreman , que tiene un enfoque declarativo y comandos de una línea para empaquetar scripts de inicio para varios formatos estándar del sistema operativo (monit, sys V, upstart, etc.). También hay evidencia de personas que han configurado cosas con gradle (por ejemplo, aquí ).
fuente
¿Estás usando Maven? Entonces deberías probar el complemento AppAssembler:
Ver: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
fuente
Se requiere la siguiente configuración en el archivo build.gradle en los proyectos Spring Boot.
build.gradle
Esto es necesario para hacer un jar totalmente ejecutable en un sistema Unix (Centos y Ubuntu)
Crear un archivo .conf
Si desea configurar propiedades JVM personalizadas o argumentos de ejecución de la aplicación Spring Boot, puede crear un archivo .conf con el mismo nombre que el nombre de la aplicación Spring Boot y colocarlo en paralelo al archivo jar.
Teniendo en cuenta que your-app.jar es el nombre de su aplicación Spring Boot, puede crear el siguiente archivo.
Esta configuración establecerá 64 MB de RAM para la aplicación Spring Boot y activará el perfil de producción.
Crea un nuevo usuario en Linux
Para mejorar la seguridad, debemos crear un usuario específico para ejecutar la aplicación Spring Boot como servicio.
Crea un nuevo usuario
En Ubuntu / Debian, modifique el comando anterior de la siguiente manera:
Configurar la clave
Hacer que springboot sea el propietario del archivo ejecutable
Prevenir la modificación del archivo jar
Esto configurará los permisos de jar para que no pueda escribirse y solo pueda leerlo o ejecutarlo su springboot propietario.
Opcionalmente, puede hacer que su archivo jar sea inmutable utilizando el comando change attribute (chattr).
También se deben establecer los permisos apropiados para el archivo .conf correspondiente. .conf requiere solo acceso de lectura (Octal 400) en lugar de acceso de lectura + ejecución (Octal 500)
Crear servicio Systemd
/etc/systemd/system/your-app.service
Reiniciar automáticamente el proceso si el sistema operativo lo mata
Agregue los dos atributos a continuación (Reiniciar y ReiniciarSec) para reiniciar automáticamente el proceso en caso de falla.
/etc/systemd/system/your-app.service
El cambio hará que la aplicación Spring Boot se reinicie en caso de falla con un retraso de 30 segundos. Si detiene el servicio utilizando el comando systemctl, no se reiniciará.
Programar servicio al inicio del sistema
Para marcar la aplicación para que se inicie automáticamente en el arranque del sistema, use el siguiente comando:
Habilitar la aplicación Spring Boot al iniciar el sistema
Comience y detenga el servicio
systemctl se puede usar en Ubuntu 16.04 LTS y 18.04 LTS para iniciar y detener el proceso.
Iniciar el proceso
Detener el proceso
Referencias
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
fuente
Continuando con la excelente respuesta de Chad, si obtiene un error de "Error: no se pudo encontrar o cargar la clase principal" , y pasa un par de horas tratando de solucionarlo, ya sea que esté ejecutando un script de shell que inicia su aplicación Java o lo inicia del sistema en sí, y usted sabe que su classpath es 100% correcto, por ejemplo, ejecutar manualmente el script de shell funciona tan bien como lo que tiene en systemd execstart. Asegúrese de que ejecutar las cosas como el usuario correcto! En mi caso, había intentado con diferentes usuarios, después de un buen tiempo de resolución de problemas, finalmente tuve el presentimiento, puse root como usuario, es decir, la aplicación comenzó correctamente. Después de determinar que era un problema de usuario incorrecto, yo
chown -R user:user
la carpeta y las subcarpetas y la aplicación se ejecutaron correctamente como el usuario y el grupo especificados, por lo que ya no es necesario ejecutarlo como root (mala seguridad).fuente
En los archivos de la unidad systemd puede establecer el directorio de variables de entorno o mediante un
EnvironmentFile
. Propondría hacer las cosas de esta manera, ya que parece ser la menor cantidad de fricción.Archivo de unidad de muestra
Luego, configure un archivo con los
/etc/sysconfig/hello-world
nombres en mayúsculas de sus variables Spring Boot. Por ejemplo, una variable llamadaserver.port
seguiría la formaSERVER_PORT
como una variable de entorno:El mecanismo que se explota aquí es que las aplicaciones Spring Boot tomarán la lista de propiedades y luego las traducirán, haciendo todo en mayúsculas y reemplazando los puntos con guiones bajos. Una vez que la aplicación Spring Boot pasa por este proceso, busca variables de entorno que coincidan y utiliza cualquiera que se encuentre en consecuencia.
Esto se resalta con más detalle en este SO Q&A titulado: ¿Cómo establecer una propiedad Spring Boot con un guión bajo en su nombre a través de Variables de entorno?
Referencias
fuente
Se puede hacer usando el servicio Systemd en Ubuntu
Puede seguir este enlace para obtener una descripción más elaborada y diferentes formas de hacerlo. http://www.baeldung.com/spring-boot-app-as-a-service
fuente
Cree un script con el nombre your-app.service (rest-app.service). Deberíamos colocar este script en el directorio / etc / systemd / system. Aquí está el contenido de muestra del script
Próximo:
Referencias
ingrese la descripción del enlace aquí
fuente