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)