Demonios

Los daemons (o demonios) no son más que un proceso que se ejecuta en segundo plano. Estos demonios ejecutan diferentes funciones y proporcionan ciertos servicios, pero sin la interacción del usuario; son procesos de los que no “notamos” su ejecución.

Los demonios pueden ser iniciados al arrancar el sistema, al entrar en un runlevel (nivel de ejecución) determinado, o simplemente cuando nosotros los iniciemos. Veremos entonces de qué modo podemos controlar nosotros mismos los demonios (iniciarlos, pararlos, etc) y cómo podemos hacer que se inicien automáticamente.

Iniciando y parando los demonios o daemons

Los programas que ejecutamos como demonios pueden estar ubicados en cualquier parte del disco, pero tienen un punto en común: todos utilizan un script para ser iniciados/parados, y estos scripts se encuentran en el directorio: /etc/init.d/

Sabiendo esto, la sintaxis habitual para iniciar/parar demonios es:

/etc/init.d/<nombre_demonio> start (para iniciar el demonio)
/etc/init.d/<nombre_demonio> stop (para detenerlo)

Ejemplos

Imaginemos que en nuestro directorio /etc/init.d tenemos los siguientes scripts:

# ls -l /etc/init.d/
-rwxr-xr-x 1 root root 1.4k oct 26 2002 httpd
-rwxr-xr-x 1 root root 1.0k ene 18 2002 iptables
-rwxr-xr-x 1 root root 1.9k ene 25 2002 ppp
-rwxr-xr-x 1 root root 2.2k oct 5 2001 rc
-rwxr-xr-x 1 root root 4.0k abr 8 2002 sshd

Por ejemplo, si quisieramos iniciar/parar/reiniciar el servidor web, podríamos hacer lo siguiente:

# /etc/init.d/httpd start
# /etc/init.d/httpd stop
# /etc/init.d/httpd restart

Y esto es válido para todos los scripts que encontremos en ese directorio. En GNU/Linux es así de sencillo iniciar y parar demonios.

Nuestros scripts

Pero aparte de los demonios del sistema y los demonios de determinadas aplicaciones, nosotros también podemos crear nuestros scripts para iniciar/parar/reiniciar los programas que nosotros queramos poner como demonios. Únicamente hemos de crear un script que siga la siguiente sintaxis:

#!/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

Esto nos dice que cuando ejecutemos el script y le pasemos el parámetro start, nos iniciará el demonio, cuando le pasemos el parámetro stop lo detendrá, y cuando le pasemos el parámetro restart lo reiniciará. Normalmente sólo root tiene permisos para iniciar/parar los servicios, pero todo depende de los permisos que se le hayan puesto al script.

Iniciando demonios automáticamente

Ahora que ya sabemos como iniciar y parar los demonios, vamos a explicar como hacer que se inicien o paren automáticamente. En GNU/Linux podemos definir qué demonios se inician y se detienen al entrar en cadarunlevel (o nivel de ejecución).

Runlevels (o niveles de ejecución)

Tenemos varios niveles de ejecución, y cada uno de ellos nos proporciona unas funcionalidades diferentes, y un entorno de trabajo distinto. La definción de cada runlevel la encontramos en el fichero /etc/inittab y suele ser la siguiente:

0 - halt (Do NOT set initdefault to this)
1 - Single user mode
2 - Multiuser, without NFS (The same as 3, if you do not have networking)
3 - Full multiuser mode
4 - unused
5 - X11
6 - reboot (Do NOT set initdefault to this)

Para saber en que nivel de ejecución estamos actualmente podemos utilizar el comando runlevel

Directorios de los enlaces

Para iniciar o parar un demonio al entrar en un runlevel simplemente tenemos que crear un enlace simbólico en el directorio correspondiente al runlevel en el que queremos iniciar/parar el demonio. Los directorios con los enlaces a los scripts de los demonios son los siguientes:

/etc/rcX.d/

donde X se corresponde con el número de runlevel. Así, por ejemplo, en el directorio /etc/rc5.d/ tenemos los enlaces a los scripts de los demonios que se iniciaran/pararan al entrar en el runlevel 5.

Sintaxis de los enlaces

Ahora que ya sabemos donde hemos de colocar nuestros enlaces ya podemos crearlos. Es muy importante el nombre que le damos a los enlaces ya que de él depende si el demonio se inicia o se para y el orden en que se inicia/para. La sintaxis que se sigue en el nombre del enlace es la siguiente:

S<num><nombre demonio> (para iniciar el demonio apuntado por el enlace)
K<num><nombre demonio> (para parar el demonio apuntado por el enlace)

<num> es el orden en que se ejecutará; puede ir desde 00 hasta 99 (siendo 00 la máxima prioridad). Además puede haber varios con la misma prioridad. Veamos unos ejemplos para aclararlo:

# cd /etc/rc5.d/
# ls -l
lrwxrwxrwx 1 root root 13 ene 8 00:45 K20ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 18 ene 7 23:49 S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 14 ene 7 23:49 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 16 ene 8 01:34 S91apache -> ../init.d/apache

En este ejemplo vemos que al entrar en el runlevel 5 se termina el demonio de ssh, y luego se arrancarn los demonios de sysklogd, cron y apache en este orden, respondiendo a la prioridad indicada en el nombre del enlace.

Ejemplo resumen

Todo esto puede parecer un poco confuso, pero vamos a ver un ejemplo práctico para poner nosotros nuestro demonio. Imaginemos que tenemos un programa que queremos que se ejecute siempre que arranque el sistema y se quede en ejecución como demonio. Haríamos lo siguiente:

  1. Crearnos un script segun al sintaxis explicada anteriormente que nos permita iniciar y parar el programa que queremos ejecutar. Lo llamaremos, por ejemplo, miscript.
  2. Nos logueamos como root, copiamos el script a /etc/init.d y le damos permiso de ejecución: 
    $ su
    # cp miscript /etc/init.d/
    # chmod u+x /etc/init.d/miscript
  3. Creamos los enlaces en los runlevels adecuados: haremos que se inicie en el runlevel 5 (X11) y en el runlevel 3 (multiusuario sin X) y que se detenga en los runlevels 6 y 0 (reiniciar y apagar): 
    # ln -s /etc/init.d/miscript /etc/rc5.d/S99miscript
    # ln -s /etc/init.d/miscript /etc/rc3.d/S99miscript
    # ln -s /etc/init.d/miscript /etc/rc6.d/K01miscript
    # ln -s /etc/init.d/miscript /etc/rc0.d/K01miscript

    Lo iniciamos con la mínima prioridad para dejar que se inicien antes los demonios más importantes, y lo paramos con la máxima, para que se detenga antes que los demonios más importantes.

Con esto hemos conseguido que nuestro programa se inicie al arrancar la máquina (ya que normalmente arranca en el runlevel 5 si tenemos instaladas las X o en el 3 encaso contrario) y que se detenga al apagarla o reiniciar. Realmente los enlaces para detener el demonio al apagar o reiniciar la máquina no son necesarios, ya que el demonio se terminará igualmente, pero siempre es mejor que termine en el orden adecuado.

Apunte final

Podemos cambiar el runlevel por defecto (el runlevel en el que quedamos una vez inicada la máquina) modificando en el fichero /etc/inittab la siguiente línea:

id:5:initdefault:

El segundo campo corresponde al runlevel por defecto. En este caso es el 5 (iniciamos con X) pero podemos cambiarlo (por ejemplo a 3 si no queremos qeu se inicien las X automáticamente).

Tutorial elaborado por Nacx para ADSLAyuda.com