Ejemplo de programación de un demonio en PerlSe nota que voy adquiriendo malas costumbres... En general, para programar un demonio en Unix, se deben seguir estos 8 pasos:
ForkEsta primera parte es bastante obvia. Se crea una copia del padre y se termina este; el hijo se "cuelga" del my $pid = fork; exit if $pid; die "Couldn't fork: $!" unless defined($pid); Independizar el procesoConvertir a nuestro proceso en líder de sesión para independizarlo de la shell y del terminal: setsid(); Cerrar descriptores innecesariosLos descriptores abiertos se heredan por el proceso hijo, así que, una de dos: o se cierran los descriptores innecesarios antes de la llamada a close(STDERR); close(STDOUT); close(STDIN); Máscara de creación de ficherosPor seguridad, puede ser interesante que los posibles ficheros temporales creados por nuestro demonio tengan unos determinados permisos. Pues establecerlos: umask(027); Directorio de trabajoConviene saber en qué directorio se está ejecutando el demonio, ¿no?
chdir("/");
Ejecutar una sola copiaEn determinados casos, puede ser interesante controlar que se ejecute una sola copia del proceso. Una opción es bloquear un fichero que contenga el pid del proceso en ejecución. poner ejemplo Capturar las señalesponer ejemplo LogAsegurarse de escribir uno (o varios) logs en algún sitio conocido, o bien utilizar poner ejemplo EjemploEste es un ejemplo trivial que escribe entradas en
#!/usr/bin/perl
use strict;
use POSIX;
use Sys::Syslog;
# Fork
my $pid = fork;
exit if $pid;
die "Couldn't fork: $!" unless defined($pid);
# Convertirse en líder de sesión
setsid();
# Cerra descriptores
close(STDERR);
close(STDOUT);
close(STDIN);
# Umask
umask(027);
# Ejecutar en /
chdir("/");
#
my $count = 0;
while (1)
{
my $msg = sprintf ("He contado hasta %d", ++$count);
openlog('triviald', 'pid', 'user');
syslog('info', $msg);
sleep(5);
}
|