Demonios

De Departamento de Informatica
Saltar a: navegación, buscar

Contenido

¿Qué es un Demonio?

En sistemas UNIX se conoce como demonio o daemon (Disk And Execution Monitor) a un proceso que se ejecuta en segundo plano del sistema operativo, se ejecuta en todo momento y no posee interacción directa con el usuario, también se le conoce genericamente como servicio o proceso, del cual no percibimos su ejecución. Un demonio realiza una operación especifica en tiempos predefinidos o en respuesta a ciertos eventos del sistema. El origen del nombre se referiere a su función de "vigilante" y no a una connotación negativa como se podría pensar en un principio.

Tecnicamente, un proceso en un sistema UNIX es un demonio cuando su proceso padre termina de ejecutarse y se le asigna como padre al proceso INIT, además no debe estar asociado a ninguna tty/terminal, sin embargo tambien se reconoce como demonio a cualquier proceso que corra en segundo plano sea hijo de INIT o no.

Ejemplos de demonio, son los servidores de las impresoras, servidores de correo, sistemas de conexión con redes, etc.

¿Como funciona un Demonio?

La mayoría de los demonios son inicializados junto con el arranque del sistema, teniendo como padre al proceso INIT, normalmente estos procesos estan en estado waiting hasta la ocurrencia de un evento en la que ejecutan su tarea, demonios conocidos son por ejemplo: Apache, httpd y Cron.

Pasos para convertir un proceso en un Demonio

Los siguiente pasos representan características esenciales de un demonio por lo que para convertir un proceso en uno es necesario seguir todas estas indicaciones.

  • Fork y Exit

Lo primero que se debe hacer es un fork() para crear un proceso hijo y luego hacer un exit() al proceso padre. Esto es necesario porque permite disociar el proceso de una tty/terminal, remueve al proceso del process group del proceso que lo creó. Esto asegura que el proceso no es un group leader ya que es algo requerido para la funcion setsid()

  • Llamar a setsid()

setsid() es una función POSIX que convierte el proceso en un session leader y group leader de un nuevo process group del cual solo él pertenece y asegura que no esta asociado a una terminal.

  • Cambiar el directorio de trabajo

El directorio en el que se trabaja debe ser cambiado con chdir a la raiz (idealmente, pero también puede ser otro directorio siempre y cuando no se encuentre montado desde un dispositivo externo). Esto es para evitar que se trabaje en un directorio que esté una partición montada ya que si el proceso se ejecuta mientras reside en una partición montada, ésta no se podrá desmontar hasta que el proceso se detenga.

  • Cambiar permisos

Umask determina los permisos por default que se le dan a los nuevos archivos. Seteando umask en 0 remueve las restricciones default que podrían limitar los permisos para que el demonio cree nuevos archivos si lo necesita.

  • Redirigir entrada y salida

Los demonios no se comunican directamente con el usuario por la entrada estandar, es por esto que se necesita cambiar la salida y entrada a /dev/null.

open STDIN,  '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/dev/null';
open STDERR, '>/dev/null';
Logging Messages

En caso que se quiera guardar un log de errores o fallas, se puede hacer redirigiendo la salida a un archivo log especificado (en vez de redirigir a /dev/null como se explicó arriba)

open STDOUT, ">>$access_log" or die "Can't write to $access_log: $!";
open STDERR, ">>$error_log" or die "Can't write to $error_log: $!";
  • Ejemplo en Perl
use POSIX qw(setsid);
chdir '/'                 or die "Can't chdir to /: $!";
umask 0;
open STDIN, '/dev/null'   or die "Can't read /dev/null: $!";
#open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>/dev/null' or die "Can't write to /dev/null: $!";
defined(my $pid = fork)   or die "Can't fork: $!";
exit if $pid;
setsid                    or die "Can't start a new session: $!";
while(1) {
  sleep(5);
  print "Hola...\n";
}

Programa que imprime en pantalla "Hola..." cada 5 segundos, notese que la linea que redirige el output esta comentada, si no lo estuviera se mandaría el mensaje a /dev/null

Referencias

Enlaces externos

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas