Tengo un script de Perl que deseo demonizar. Básicamente, este script perl leerá un directorio cada 30 segundos, leerá los archivos que encuentre y luego procesará los datos. Para mantenerlo simple aquí considerar el siguiente script Perl (llamado synpipe_server, hay un enlace simbólico de este script en /usr/sbin/
):Llamar a daemon en un script /etc/init.d es de bloqueo, no se está ejecutando en segundo plano
#!/usr/bin/perl
use strict;
use warnings;
my $continue = 1;
$SIG{'TERM'} = sub { $continue = 0; print "Caught TERM signal\n"; };
$SIG{'INT'} = sub { $continue = 0; print "Caught INT signal\n"; };
my $i = 0;
while ($continue) {
#do stuff
print "Hello, I am running " . ++$i . "\n";
sleep 3;
}
Así que, básicamente, este script imprime algo cada 3 segundos.
Entonces, como yo quiero demonizar este script, también he puesto este script bash (también llamado synpipe_server) en /etc/init.d/
:
#!/bin/bash
# synpipe_server : This starts and stops synpipe_server
#
# chkconfig: 12345 12 88
# description: Monitors all production pipelines
# processname: synpipe_server
# pidfile: /var/run/synpipe_server.pid
# Source function library.
. /etc/rc.d/init.d/functions
pname="synpipe_server"
exe="/usr/sbin/synpipe_server"
pidfile="/var/run/${pname}.pid"
lockfile="/var/lock/subsys/${pname}"
[ -x $exe ] || exit 0
RETVAL=0
start() {
echo -n "Starting $pname : "
daemon ${exe}
RETVAL=$?
PID=$!
echo
[ $RETVAL -eq 0 ] && touch ${lockfile}
echo $PID > ${pidfile}
}
stop() {
echo -n "Shutting down $pname : "
killproc ${exe}
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f ${lockfile}
rm -f ${pidfile}
fi
}
restart() {
echo -n "Restarting $pname : "
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status ${pname}
;;
restart)
restart
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
;; esac
exit 0
Por lo tanto, (si tengo bien entendido el doc para el demonio) el script de Perl debe ejecutarse en segundo plano y la salida debe ser redirigido a /dev/null
si ejecuto:
service synpipe_server start
Pero aquí es lo que me pasa en su lugar:
[[email protected] init.d]# service synpipe_server start
Starting synpipe_server : Hello, I am running 1
Hello, I am running 2
Hello, I am running 3
Hello, I am running 4
Caught INT signal
[ OK ]
[[email protected] init.d]#
Comienza el script de Perl pero lo ejecuta sin separarlo de la sesión del terminal actual, y puedo ver el resultado impreso en mi consola ... que no es realmente lo que esperaba. Además, el archivo PID está vacío (o solo con un avance de línea, ningún pid devuelto por daemon).
¿Alguien tiene alguna idea de lo que estoy haciendo mal?
EDITAR: quizás debería decir que estoy en una máquina de Red Hat.
Scientific Linux SL release 5.4 (Boron)
Gracias, , Tony
En lugar de escribir un demonio para sondear los cambios, se puede utilizar inotify http://en.wikipedia.org/wiki/Inotify para informarle cuando un cambio pasó. Es más fácil codificar, más eficiente y puede ver las actualizaciones más rápido. Hay una serie de módulos de CPAN para hablar con él. http://search.cpan.org/search?query=inotify&mode=all – Schwern
Gracias, esta es información útil, definitivamente echaré un vistazo a Inotify. – tony
@Schwern: eso no cambia el hecho de que tengo que ejecutar un daemon en segundo plano esperando notificaciones de inotify, ¿no? – tony