Desarrollo

Ejecutar un proceso de Java como un servicio en Linux

Por necesidades de un proyecto en el que estoy trabajando, debía ejecutar un proceso de Java como un servicio en Linux (ubuntu 16.04.2 – xenial). No es complicado, pero seguramente se me olvidará cuando pase el tiempo, y es por eso que lo voy a compartir aquí.

  1. Crear un fichero en /etc/init.d/ y pegar el código de ejemplo que hay más abajo.
  2. Modificar las variables SERVICE_NAME, JAR_PARAMS, PATH_TO_JAR y seleccionar un PID_PATH_NAME que almacenará el servicio de forma temporal.
  3. Modificar los permisos de ejecucuón del fichero creado: sudo chmod +x /etc/init.d/myservice
  4. Probamos la ejecución: sudo service myservice start
  5. Probamos la detención: sudo service myservice stop
  6. Probamos el reinicio: sudo service myservice restart

Otros comandos:

  • Usa nohup java -jar myservice.jar & para verificar si tu servicio funciona.
  • Usa sudo update-rc myservice defaults si quieres que el servicio se inicie cuando inicie tu sistema operativo.
  • Usa sudo update-rc myservice disable para eliminar la ejecución cuando se inicie tu sistema operativo.

Nota: Una vez terminado, recuerda reiniciar los servicios con systemctl daemon-reload

Código de ejemplo:

#!/bin/sh
echo "Starting..."
SERVICE_NAME=ServiceName
JAR_PARAMS=-Dspring.profiles.active=pro
PATH_TO_JAR=ServiceJar
PID_PATH_NAME=/tmp/service-pid
case $1 in
start)
echo "Starting $SERVICE_NAME ..."
if [ ! -f $PID_PATH_NAME ]; then
nohup java $JAR_PARAMS -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME started ..."
else
echo "$SERVICE_NAME is already running ..."
fi
;;
stop)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stoping ..."
kill $PID;
echo "$SERVICE_NAME stopped ..."
rm $PID_PATH_NAME
else
echo "$SERVICE_NAME is not running ..."
fi
;;
restart)