icono_twiter icono Facebook
Carlos García Pérez

Técnico especialista en informática de empresa (CEU).

Ingeniero Técnico en Informática de Sistemas (UPM)

Creador de MobileTest, Haaala!, Girillo, toi18n.

Charla sobre desarrollo de aplicaciones en Android.

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2007-12-14

Tutorial visitado 8.583 veces Descargar en PDF
Monitorización de Servicios: start, stop, restart, status

Monitorización de servicios: start, stop, restart, status

En este tutorial os voy a mostrar como lanzar un aplicación en modo servicio con las siguientes características:

  • El servicio respondará a los mensajes: start, stop, restart, status.
  • El servicio se iniciará automáticamente cuando se inicie la máquina.
  • El servicio se iniciará automáticamente en caso de que sea detenido.

Como veis son muchas tareas las que vamos a realizar, asi que empezemos poco a poco.

Uno de los problemas que tenemos que resolver es saber cuando un servicio está obreciendo servicio a sus clientes. La mejor forma de saberlo es haciéndole una petición para ver si contexta.
Para este ejemplo, vamos a crear un Thread que será facilmente integrable con cualquier aplicación y que simplemente contexta una petición UDP sobre un puerto determinado retornando un "ok" al cliente, es decir algo parecido a un PING.

Código fuente que necesitamos integrar en nuestros servicios:
Código fuente de ejemplo de integración en un servicio:

La integración se puede observar en las líneas 19, 33 y 45.

Código fuente para consultar el estado del servicio:

A continuación vamos a hacer que el servicio responda a las peticiones: start, stop, restart, status.

En Unix, los servicios suelen responder a estos mensajes (al menos a start y stop). Para ellos cada servicio tiene un script en el directorio /etc/init.d.

Script de inicio, parada, reinicio, status. example_service.sh:.

(Lo debemos crear en el directorio /etc/init.d)

        #!/bin/bash
        
        # ------------------------------------------------------------------------
        # Este Script para iniciar, parar y monitorizar el servicio de ejemplo 
        # debe ser colocado en el directorio /etc/init.d 
        # ------------------------------------------------------------------------
        
        SERVICE_PATH="/home/carlosgarcia"
        
        case "$1" in
        	start)
        	  sh $SERVICE_PATH/example_service_start.sh
        	  ;;
        	stop)	  
        	  sh $SERVICE_PATH/example_service_stop.sh
        	  ;;
        	restart)
        	  sh $SERVICE_PATH/example_service_restart.sh
        	  ;;
        	status)
        	  sh $SERVICE_PATH/example_service_status.sh
        	  ;;	  
        	*)
        	  echo "Uso: $0 {start|stop|restart|status)}"
        	  exit 1
        	  ;;
        esac
        
        exit 0
    
Reinicia el servicio de ejemplo. example_service_restart.sh:
      #!/bin/bash
      # Este Script reinicia el servicio de ejemplo 
      
      SERVICE_PATH="/home/carlosgarcia"
      
      sh $SERVICE_PATH/example_service_stop.sh
      sh $SERVICE_PATH/example_service_start.sh
    
Inicia el servicio de ejemplo para este tutorial. example_service_start.sh:
      #!/bin/bash
      # Este Script para inicia el servicio de ejemplo para este tutorial
       
      SERVICE_PATH="/home/carlosgarcia"
      PID_FILE="$SERVICE_PATH/example_service.pid"
      
      cd $SERVICE_PATH
      
      # Iniciamos el servicio de ejemplo
      $JAVA_HOME/bin/java -cp $SERVICE_PATH com.autentia.tutoriales.servicemonitor.ServiceMonitorApp &
      
      # Guardamos el PID del proceso en un archivo
      echo $! > "$PID_FILE"
    
Detiene el servicio de ejemplo para este tutorial. example_service_stop.sh:
        #!/bin/bash
        # Este Script detiene el servicio de ejemplo 
        
        SERVICE_PATH="/home/carlosgarcia"
        PID_FILE="$SERVICE_PATH/example_service.pid"
        
        # Cargamos en una variable el PID del proceso que estaba almacenado en un archivo.
        read  PID_VAR < $PID_FILE
        
        # Detenemos el proceso
        kill $PID_VAR
        
        # Eliminamos el archivo en donde almacenábamos el PID del proceso.
        rm -f $PID_FILE    
    
Consulta el estado del servicio de ejemplo para este tutorial. example_service_status.sh:
        #!/bin/bash
        # Este Script consulta el estado del servicio de ejemplo
        
        SERVICE_PATH="/home/carlosgarcia"
        
        $JAVA_HOME/bin/java -cp $SERVICE_PATH com.autentia.tutoriales.servicemonitor.ServiceStatusTest
        
        if test $? -eq 0
        then
        	echo "Estado: OK"	
        else
         	echo "Estado: KO"
        fi    
    

A continuación mostramos las comandos que deberíamos escribir para iniciar, detener, reiniciar y consultar el estado del servicio.

  • /etc/init.d/example_service start
  • /etc/init.d/example_service stop
  • /etc/init.d/example_service restart
  • /etc/init.d/example_service status

Monitorización del servicio para iniciarlo automáticamente en caso de que esté detenido.

Inicia el servicio en caso de que no responda a la consulta de STATUS example_service_monitor.sh:
      #!/bin/bash
      
      # Este Script inicia el servicio en caso de que no responda a la consulta de STATUS
      
      SERVICE_PATH="/home/carlosgarcia"
      
      $JAVA_HOME/bin/java -cp $SERVICE_PATH com.autentia.tutoriales.servicemonitor.ServiceStatusTest
      
      # Consultamos el valor de retorno. (
      if test $? -ne 0
      then
      	sh $SERVICE_PATH/example_service_restart.sh	
      fi    
    

(Observe las líneas 61 y 63 del cliente ServiceStatusTest)

Ahora tecleamos las dos líneas siguientes para monitorizar el estado del servicio

Vamos a apoyarnos en el cron (gestor de tarea programadas) para que monitorize el estado del servicio cada 5 segundos

      
  • (La siguiente línea abrirá un editor para editar el archivo crontab del usuario)
    crontab -e
  • (Debemos introducir esa linea para monitorizar el estado cada 5 segundos)
    */5 * * * * "sh /home/carlosgarcia/example_service_monitor.sh"

Ojo!! En algunas versiones de cron no funciona */5, pruebe con un 5.

Iniciando el servicio en el arranque de la máquina

Si deseamos que el servicio de ejemplo se inicie automáticamente cuando la máquina arranque debemos seguir los siguientes pasos:

  • Copiamos o movemos el archivo example_service en el directorio /etc/init.d (Si no lo habíamos hecho ya).
  • (Creamos un enlaze simbólico en el nivel de arranque 2.

    ln -s /etc/init.d/example_service /etc/rc2.d/S99example_service.

    Dentro del sistema operativo, existen varios niveles de arranque (de 0 a N) y dentro de cada nivel los servicios se inician según un orden (0-99).
    La S significa "START".

    Para saber en que nivel arranca tu sistema, deberás consultar la propiedad initdefault del archivo /etc/inittab

Un saludo.

Carlos García. Autentia.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL: