Linux: Los daemons

Como ya sabemos, GNU/Linux nos permite ejecutar simultáneamente tantos procesos como queramos repartiendo equitativamente el tiempo de la CPU entre ellos. De hecho, el mecanismo de manejo de procesos también debe tener en cuenta lo que se llaman interrupciones. Una interrupción es una señal que llega al núcleo del sistema desde cualquiera de los dispositivos que tenemos instalados en nuestro ordenador. Estas interrupciones suelen estar vinculadas a algún proceso en concreto, de manera que el núcleo debe despertar el proceso en cuestión (si no está en ejecución) y redirigirle la interrupción para que la procese adecuadamente.

Un ejemplo típico de interrupción es cuando apretamos una tecla del teclado o movemos el ratón: al hacerlo, el dispositivo envía una señal que debe ser redirigida hacia la aplicación correspondiente para que sea tratada de manera adecuada

Para poder manejar adecuadamente todas las interrupciones que se producen, el núcleo no escucha permanentemente a los dispositivos del sistema esperando sus señales. En lugar de hacerlo, el sistema ejecuta las operaciones de los procesos en cola de ejecución y sólo cuando se produce una interrupción atiende al dispositivo que la ha generado. Esto debe realizarse de esta manera debido a la gran diferencia de velocidad entre los dispositivos del sistema y la CPU. El tratamiento de interrupciones es fundamental para cualquier sistema operativo, ya que es este mecanismo, entre otros, el que nos permite mantener en ejecución tantos procesos como queramos y, en cuanto lleguen las interrupciones, despertar los procesos que las están esperando.

Un daemon (disk and execution monitor) es un proceso que, generalmente, tenemos cargado en memoria, esperando alguna señal (proveniente de una interrupción de dispositivo o del mismo núcleo) para despertarse y ejecutar las funciones necesarias para tratarla. Aunque esta definición también puede encajar con otros procesos del sistema (lanzados por los usuarios o por el mismo sistema), un daemon también suele ajustarse a este modo de ejecución (aunque en algunos casos especiales, no). De esta manera, los daemons que tengamos cargados no ocupan la CPU mientras no es estrictamente necesario y por muchos que tengamos en memoria siempre podremos trabajar con el ordenador sin problemas.

Aunque un daemon sea un proceso como cualquier otro que se ejecuta en modo background, el modo como los organizamos y tratamos sí que es diferente del resto de comandos y programas del sistema. Generalmente, todos los daemons tienen un shellscript situado en el directorio /etc/init.d/ que nos permite iniciarlo, pararlo o ver su estado de ejecución. Para realizar algunas de estas funciones debemos ejecutar el shellscript correspondiente al daemon que queramos tratar pasándole alguno de los siguientes parámetros:

start: para iniciar el daemon. Si este ya estuviera ejecutándose, se muestra un mensaje de error.

stop: para parar el daemon. Si no estuviera ejecutándose, se muestra unmensaje de error.

restart: reinicia el daemon. Sirve para que se vuelvan a leer los archivos de configuración del mismo.

reload: aunque no todos los daemons lo permiten, este parámetro sirve para poder recargar los archivos de configuración sin tener que pararlo.

La mayoría de estos scripts utilizan un programa llamado startstop-daemon que nos proporciona el sistema operativo y que sirve para el tratamiento de estos procesos. Es habitual que al administrar un servidor debamos diseñarnos nuestros propios daemons para realizar alguna tarea concreta. En el directorio donde se sitúan todos los shellscripts de los daemons también se suele encontrar uno de ejemplo (/etc/init.d/skeleton) para que lo podamos utilizar cuando necesitemos configurar uno nuevo que no esté en la distribución.
Generalmente suelen estar programados de la siguiente manera:

#!/bin/sh
PATH=/usr/local/bin DAEMON=/usr/sbin/daemon
NAME=daemon
DESC="some daemon"
test -x $DAEMON || exit 0
set -e
case "$1" in
  start)
    echo -n "Starting $DESC: $NAME"
    start-stop-daemon --start --quiet --pidfile \
    /var/run/$NAME.pid --exec $DAEMON echo "."
  ;;
  stop)
    echo -n "Stopping $DESC: $NAME "
    start-stop-daemon --stop --quiet --pidfile \
    /var/run/$NAME.pid --exec $DAEMON echo "."
  ;;
  restart|force-reload)
    echo -n "Restarting $DESC: $NAME"
    start-stop-daemon --stop --quiet --pidfile \
    /var/run/$NAME.pid --exec $DAEMON
    sleep 1
    start-stop-daemon --start --quiet --pidfile \
    /var/run/$NAME.pid --exec $DAEMON echo "."
  ;;
  *)
    N=/etc/init.d/$NAME echo " Usage: $N {start|stop| \
    restart|force-reload}" >&2
    exit 1
  ;;
esac
exit 0

Para ejecutar un daemon, debemos llamarlo con su ruta completa (/etc/init.d/nombreDaemon) y pasarle el parámetro que nos interese. Algunas distribuciones incorporan el comando service, que permite hacer lo mismo sin tener que especificar la ruta completa.

Como hemos visto, en las variables declaradas al inicio del shellscript especificamos qué PATH es necesario para el proceso del daemon, el programa que vamos a ejecutar (DAEMON), el nombre que le damos (NAME, que debe ser igual que el nombre del shell script) y su descripción (DESC). Lo único que hace el código al arrancar el daemon es escribir en el directorio /var/run/ un fichero con el PID del proceso. Al pararlo, se va a buscar este PID y se envía la señal de finalización al proceso correspondiente. Naturalmente, encontraremos shellscripts preparados para realizar muchísimas más operaciones con el daemon que vamos a tratar, aunque como mínimo todos deben tener esta estructura.

Fuente: UOC OpenCourseWare

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: