Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

lunes, 5 de octubre de 2015

Cómo crear nuestro propio demonio en Linux

En esta ocasión vengo a hablaros sobre un pequeño truco que podemos usar en bash para poder crear nuestro propio demonio en Linux; pero antes de nada: ¿Qué es un demonio? El nombre puede sonar malévolo, pero en verdad no es así... Simplemente se trata de un servicio que corre en segundo plano de forma continua, lo cual nos evita hacer uso de recursos tales como cron para ejecutarlo cada cierto tiempo; dicho demonio puede parecer complicado de realizar, pero lo cierto es que únicamente requiere poseer ciertos conocimientos de bash
Devil-tux
Para crear un demonio requeriremos de dos partes: El controlador del demonio y el demonio en sí. Es importante poseer de ambas partes, ya que sino tendríamos un demonio "descontrolado"; cosa que no es nada práctico. Por ello primero empezaríamos creando un script que haría de controlador; Dicho controlador será capaz de ejecutar el demonio, pararlo, reiniciarlo y comprobar su estado. Dicho "controlador" bien podría servir como "esqueleto" para futuros demonios, con lo que puede resultarnos muy útil; a este esqueleto lo he llamado demonio.sh:

  1. #!/bin/bash
  2. PIDFILE=/tmp/demonio.pid
  3. SRV="demonio"
  4. function status()
  5. if [ -f ${PIDFILE} ];
  6. then
  7.         echo "El demonio  esta en marcha"
  8. else
  9.         echo "El demonio esta parado"
  10. fi
  11. function start(){
  12.  echo -n $"Iniciando servicio ${SRV}: "
  13.  /usr/bin/demon >/dev/null 2>&1 &
  14.  RETVAL=$?
  15.  echo $! > $PIDFILE
  16.  if [ ${RETVAL} -eq 0 ];
  17.  then
  18.         echo "Se ha iniciado ${SRV}"
  19.  else
  20.         echo "No se ha podido iniciar ${SRV}"
  21.  fi
  22.  echo
  23. }
  24. function stop(){
  25.  echo -n $"Parando servicio ${SRV}: "
  26.  SERV=$(ps -e |grep ${SRV} |awk '{print $1}')
  27.  kill -9 ${SERV}
  28.  echo
  29. }
  30. function restart(){
  31.  stop
  32.  sleep 10
  33.  start
  34. }
  35. # Dependiento del parametro que se le pase
  36. #start - stop - restart ejecuta la funcion correspondiente.
  37. case "$1" in
  38. start)
  39.  start
  40.  ;;
  41. stop)
  42.  stop
  43.  ;;
  44. restart)
  45.  restart
  46.  ;;
  47. status)
  48.  status
  49. ;;
  50. *)
  51.  echo $"Usar: $0 {status|start|stop|restart}"
  52.  exit 1
  53. esac
  54. exit 0

Ahora que tenemos nuestro controlador creado, únicamente habría que crear el script correspondiente. En este caso el script debe de llamarse demon; script que iría alojado en /usr/bin. Es importante que este script se esté ejecutando constantemente, es decir que dicho script ejecute un bucle infinito para que así nunca se detenga (a menos que se lo ordenemos). Un ejemplo muy simple (pero funcional) sería:

  1. #!/bin/bash
  2. #VARIABLES
  3. ACTIVE=y
  4. #ACTIVO HASTA QUE LO MATEMOS MEDIANTE demonio.sh stop
  5. while [${ACTIVE} == 'y'];
  6. do
  7.         tail -n 100 /var/log/syslog |grep DHCP > /tmp/test.txt
  8.         if [ -s /tmp/test.txt ];
  9.         then
  10.                 echo "$(date) DHCP" > /tmp/dhcp.txt
  11.         fi
  12. done

Este bucle sería infinito pues ACTIVE siempre sería 1; con lo que únicamente podría ser detenido mediante el controlador demonio.sh

Obviamente este script es un demonio muy simple, pero podría complicarse todo lo que nosotros viésemos oportuno, siempre y cuando estuviese dentro de un bucle infinito. Ahora dependería de uno mismo explotar las posibilidades que esto ofrece con el fin de adaptarlo a sus necesidades.

Espero que os resulte útil.

Saludos.

5 comentarios :