Para crear tareas recursivas o que se inicien automáticamente al arranque de nuestro sistema Linux, no hay nada como un demonio.¿Y qué es un demonio (del inglés daemon, Disk And Execution MONitor)? Pues no es más que un conjunto de instrucciones (ficheros) que nuestra máquina ejecutará ante unas determinadas circunstancias para lanzar un programa, un juego de instrucciones, conectarse a un servidor...

Introducción:

Tomando la definición de Wikipedia: "Un demonio, daemon o dæmon (de sus siglas en inglés Disk And Execution MONitor), es un tipo especial de proceso informático no interactivo, es decir, que se ejecuta en segundo plano en vez de ser controlado directamente por el usuario. Este tipo de programas se ejecutan de forma continua (infinita), vale decir, que aunque se intente cerrar o matar el proceso, este continuará en ejecución o se reiniciará automáticamente. Todo esto sin intervención de terceros y sin dependencia de consola alguna."

Dicho en palabras llanas, es un programa que se lanza al inicio y se ejecuta con una serie de parámetros prefijados por el usuario. A priori, parece algo que deba hacer el sistema operativo sólo, pero vamos a ver que podemos crear nuestros propios demonios si siempre ejecutamos ciertas tareas al inicio (como, por ejemplo, abrir una consola para monitorizar los sensores de la placa base).

Cabe destacar que, como se cita en la definición de Wikipedia, un demonio no se puede interrumpir con un kill, porque se volverá a ejecutar (resucitará). Lo que debemos hacer será pararlo con un stop, y volverlo a lanzar cuando nos convenga con un start. Y esto lo deberemos hacer cada vez que se reinicie la máquina, porque en cada reinicio, se restauran.

¿Cómo podemos saber cuántos demonios tengo en ejecución? Pues, sencillamente, abriendo una consola y poniendo:

$ ls -l /etc/init.d/

En el caso de nuestra máquina, este comando devuelve lo siguiente:

total 272
-rwxr-xr-x. 1 root root 1410 abr 7 2011 apt
-rwxr-xr-x. 1 root root 2122 jul 20 2011 atd
-rwxr-xr-x. 1 root root 3378 ago 15 20:26 auditd
-rwxr-xr-x. 1 root root 2540 may 9 2011 avahi-daemon
-rwxr-xr-x. 1 root root 2324 sep 27 00:16 backuppc
-rwxr-xr-x. 1 root root 5124 may 30 2011 cgconfig
-rwxr-xr-x. 1 root root 3605 may 30 2011 cgred
-rwxr-xr-x. 1 root root 10006 feb 8 2011 cpuspeed
-rwxr-xr-x. 1 root root 3017 sep 28 14:56 cups

Para detener el demonio de impresión CUPS (Sistema de impresión común de Unix, abreviado CUPS), hacemos:

$ /etc(init.d/cups stop

Para iniciarlo:

$ /etc(init.d/cups start

Y para reiniciarlo:

$ /etc(init.d/cups restart

Ahora que ya nos manejamos un poco, pasemos a crear nuestro propio demonio.


Creación del script del demonio:

En primer lugar, debemos crear un script que sea interpretado por el bash de Linux:

#!/bin/sh
case "$1" in
start)
# código para iniciar el demonio/programa
;;
stop)
# código para parar el demonio/programa
;;
restart)
# código para reiniciar el demonio/programa
;;
esac

Con este script conseguimos que dependiendo de qué parámetro le pasemos (start, stop, restart) el demonio se inicie, se pare o se reinicie.

Para iniciarlo automáticamente:

Con lo anterior, ya tenemos nuestro "demonio", pero es un poco "vago", ya que no se lanza automáticamente al inicio. Tendríamos que lanzarlo manualmente nosotros. Para hacerlo automático tenemos que enlazarlo con un runlevel adecuado. Un runlevel no es otra cosa que un nivel de ejecución. Linux tiene 7 niveles de ejecución, del 0 al 6. Hay dos que no se pueden usar nunca: el 0, halt (parar todo, es decir, apagar) y el 6, reboot (reinicio). Los que nos interesan a nosotros son el 3 (Full multiuser mode) y el 5 (X11) .

Parece que todo se complica pero es muy fácil: Debemos enlazar nuestro script con un runlevel determinado, que se encuentran en /etc/rc3.d/ (para el runlevel 3) y en /etc/rc5.d/ (para el runlevel 5). Si tecleamos lo siguiente en una consola nos puede aclarar las ideas:

$ ls -l /etc(rc5.d/

que devuelve:

lrwxrwxrwx. 1 root root 13 dic 17 03:07 K01apt -> ../init.d/apt
lrwxrwxrwx. 1 root root 16 may 13 2011 K10psacct -> ../init.d/psacct
lrwxrwxrwx. 1 root root 15 dic 17 02:52 K10zvbid -> ../init.d/zvbid
lrwxrwxrwx. 1 root root 15 dic 23 15:07 K15httpd -> ../init.d/httpd

(...)

lrwxrwxrwx. 1 root root 17 may 13 2011 S00livesys -> ../init.d/livesys
lrwxrwxrwx. 1 root root 22 dic 16 21:23 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 16 may 13 2011 S07iscsid -> ../init.d/iscsid
lrwxrwxrwx. 1 root root 19 may 13 2011 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 may 13 2011 S08iptables -> ../init.d/iptables

Las K y las S tienen un significado especial: K detiene el demonio y S lo inicia. La pareja de números que le siguen designan la prioridad (de 00 a 99) con la que será atendido el demonio (00 es la máxima prioridad y 99 la mínima).


Resumiendo:

  • Creamos el fichero con el script y le damos un nombre, por ejemplo scriptprueba:

#!/bin/sh

case "$1" in
start)
# código para iniciar el demonio/programa
;;
stop)
# código para parar el demonio/programa
;;
restart)
# código para reiniciar el demonio/programa
;;
esac
  • Copiamos el scrpt a /etc/init.d/ y se le dan permisos de ejecución a todos los grupos

$ sudo su
$ cp scriptprueba /etc/init.d/
$ chmod u+x /etc/init.d/scriptprueba

  • Copiamos los enlaces con el comando 'ln' en los runlevels adecuados

$ ln -s /etc/init.d/scriptprueba /etc/rc5.d/S98scriptprueba
$ ln -s /etc/init.d/scriptprueba /etc/rc3.d/S98scriptprueba
$ ln -s /etc/init.d/scriptprueba /etc/rc6.d/K01scriptprueba
$ ln -s /etc/init.d/scriptprueba /etc/rc0.d/K01scriptprueba

Y con esto, ya tenemos nuestro demonio (con los comandos que hayamos introducido en el script) listo para que se inicie en el próximo reinicio.

 

Fuente: http://www.adslayuda.com/Linux-demonios.html