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.
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:
- #!/bin/bash
- PIDFILE=/tmp/demonio.pid
- SRV="demonio"
- function status()
- if [ -f ${PIDFILE} ];
- then
- echo "El demonio esta en marcha"
- else
- echo "El demonio esta parado"
- fi
- function start(){
- echo -n $"Iniciando servicio ${SRV}: "
- /usr/bin/demon >/dev/null 2>&1 &
- RETVAL=$?
- echo $! > $PIDFILE
- if [ ${RETVAL} -eq 0 ];
- then
- echo "Se ha iniciado ${SRV}"
- else
- echo "No se ha podido iniciar ${SRV}"
- fi
- echo
- }
- function stop(){
- echo -n $"Parando servicio ${SRV}: "
- SERV=$(ps -e |grep ${SRV} |awk '{print $1}')
- kill -9 ${SERV}
- echo
- }
- function restart(){
- stop
- sleep 10
- start
- }
- # Dependiento del parametro que se le pase
- #start - stop - restart ejecuta la funcion correspondiente.
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- status)
- status
- ;;
- *)
- echo $"Usar: $0 {status|start|stop|restart}"
- exit 1
- esac
- 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:
- #!/bin/bash
- #VARIABLES
- ACTIVE=y
- #ACTIVO HASTA QUE LO MATEMOS MEDIANTE demonio.sh stop
- while [${ACTIVE} == 'y'];
- do
- tail -n 100 /var/log/syslog |grep DHCP > /tmp/test.txt
- if [ -s /tmp/test.txt ];
- then
- echo "$(date) DHCP" > /tmp/dhcp.txt
- fi
- 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.
gracias
ResponderEliminarGracias
ResponderEliminar/demon: line 10: [y: command not found
ResponderEliminargracias
ResponderEliminarGracias por el aporte!
ResponderEliminar