A logo showing the text blog.marcnuri.com
English
Inicio»Java»Spring-boot como un servicio en Linux

Entradas Recientes

  • Fabric8 Kubernetes Client 7.2.0 está disponible!
  • Conectarse a un servidor MCP con JavaScript y AI SDK
  • Conectarse a un servidor MCP con JavaScript y LangChain.js
  • El Futuro de las Herramientas para Desarrolladores en la era de la IA
  • Conectarse a un servidor Model Context Protocol (MCP) con Java y LangChain4j

Categorías

  • Antiguo
  • Front-end
  • Go
  • Herramientas
  • Industria y negocios
  • Inteligencia Artificial
  • Java
  • JavaScript
  • Operaciones
  • Personal
  • Proyectos personales

Archivos

  • mayo 2025
  • abril 2025
  • marzo 2025
  • febrero 2025
  • enero 2025
  • diciembre 2024
  • noviembre 2024
  • agosto 2024
  • junio 2024
  • mayo 2024
  • abril 2024
  • marzo 2024
  • febrero 2024
  • enero 2024
  • diciembre 2023
  • noviembre 2023
  • octubre 2023
  • septiembre 2023
  • agosto 2023
  • julio 2023
  • junio 2023
  • mayo 2023
  • abril 2023
  • marzo 2023
  • febrero 2023
  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • junio 2020
  • mayo 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • enero 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • diciembre 2014
  • marzo 2014
  • febrero 2011
  • junio 2008
  • mayo 2008
  • abril 2008
  • enero 2008
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007

Spring-boot como un servicio en Linux

2017-10-02 en Java / Operaciones etiquetado Demonio / Linux / Servicio / Spring Framework / Spring Boot / Systemctl / systemd por Marc Nuri | Última actualización: 2021-03-19

Introducción

En este post mostraremos como configurar una aplicación Spring Boot para que se ejecute como un servicio en Linux. En primer lugar se muestran las instrucciones para configurar el servicio con scripts compatibles con sistemas de inicio tipo System V, en segundo se muestra como configurar el servicio en sistemas más nuevos que emplean systemd.

Jar ejecutable

Una de las ventajas de Spring Boot es que nos permite crear Jar ejecutables de forma autónoma, esto nos permite tratar directamente la aplicación empaquetada en un Jar como un ejecutable que a su vez dispone de parámetros como “start”, “stop”, “restart”, “status” que son de utilidad a la hora de gestionar servicios.

Para crear un Jar ejecutable debemos de hacer una de las siguientes dos configuraciones en función de si usamos Maven o Gradle:

Maven

Añadir lo siguiente al pom.xml del proyecto:

1<plugin>
2    <groupId>org.springframework.boot</groupId>
3    <artifactId>spring-boot-maven-plugin</artifactId>
4    <configuration>
5        <executable>true</executable>
6    </configuration>
7</plugin>

Gradle

Añadir lo siguiente al build.gradle del proyecto:

1springBoot {
2    executable = true
3}

Arrancar la aplicación desde el Jar, además de soportar las opciones anteriormente mencionadas, implica lo siguiente:

  • El script inicia la aplicación con el usuario propietario del script
  • El script hace un seguimiento del PID de la aplicación empleando /var/run/<nombreaplicacion>/<nombreaplicacion>.pid
  • El script escribe los logs en /var/log/<nombreaplicacion>.log

Instalación como servicio init.d (System V)

Para este caso vamos a aprovechar las propiedades anteriormente mencionadas de los Jars ejecutables que se pueden crear en Spring-Boot.

En este caso, la tarea será tan sencilla como añadir un enlace simbólico al Jar en el directorio init.d:

1sudo ln -s /var/<pathaplicacion>/<nombreaplicacion>.jar /etc/init.d/<nombreaplicacion>

Una vez hecho esto, se puede arrancar/parar/reiniciar la aplicación exactamente igual que con cualquier otro servicio:

1service <nombreaplicacion> start

Del mismo modo, podemos marcar la aplicación (servicio) para que se inicie de forma automática al arrancar el equipo:

1update-rc.d <nombreaplicacion> defaults

Asegurando el servicio

Tal como se ha indicado, el servicio init.d arrancará la aplicación con el usuario propietario de la aplicación. En este sentido, es importante que este usuario disponga de los permisos necesarios para que la aplicación se comporte correctamente.

El usuario empleado para iniciar la aplicación debería de ser uno sin posibilidad de login. Podemos emplear el siguiente comando para modificar el shell y prevenir login al usuario:

1chsh -s /usr/sbin/nologin <usuario>

Podemos cambiar el usuario propietario de la aplicación del siguiente modo:

1chown <usuario>:<grupo> <nombreaplicacion>.jar

El jar de la aplicación debería de tener únicamente propiedades de lectura y ejecución para su propietario, para ello cambiamos sus atributos:

1chmod 500 <nombreaplicacion>.jar

Al final deberíamos tener una estructura como la siguiente:

Propiedades aplicacion spring como servicio
Propiedades aplicacion spring como servicio

Instalación como servicio systemd

Hoy en día, la mayoría de distribuciones de Linux emplean systemd para gestionar los procesos del sistema. A diferencia de SystemV donde los parámetros de inicio son por convención, en el caso de systemd es por configuración, por lo que para habilitar un servicio es necesario crear un script de configuración.

Script de configuración

Los script se ubican en el directorio /etc/systemd/service, por lo que para nuestra aplicación tendremos que crear un fichero llamado /etc/systemd/service/<nombreaplicacion>.service como el siguiente:

1[Unit]
2Description=<nombreaplicacion>
3After=syslog.target
4
5[Service]
6User=<usuarioejecutor>
7ExecStart=/path/a/aplicacion/<nombreaplicacion>.jar
8SuccessExitStatus=143
9
10[Install]
11WantedBy=multi-user.target

Para marcar el servicio para que se inicie de forma automática al arrancar el equipo emplearemos el siguiente comando:

1sudo systemctl enable nombreaplicacion.service
Spring boot as a Linux service
Spring boot as a Linux service

Referencias

  • https://stackoverflow.com/questions/21503883/spring-boot-application-as-a-service
  • https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment-initd-service
  • https://www.freedesktop.org/software/systemd/man/systemd.service.html
Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Navegador de artículos
Spring Bean Scopes: Guía para comprender los distintos scopes (ámbitos) de un Spring BeanSpring-data + Mongo: Secuencia autoincremental en MongoDB mediante un servicio de Spring
© 2007 - 2025 Marc Nuri