Tengo un script de Perl que quiero demonizar. Básicamente, este script de Perl leerá un directorio cada 30 segundos, leerá los archivos que encuentre y luego procesará los datos. Para simplificarlo, considere el siguiente script de Perl (llamado synpipe_server, hay un enlace simbólico de este script en /usr/sbin/
):
#!/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;
}
Entonces, este script básicamente imprime algo cada 3 segundos.
Luego, como quiero demonizar este script, también puse 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
Entonces, (si he entendido bien el documento para daemon), el script Perl debería ejecutarse en segundo plano y la salida debería redirigirse a /dev/null
si ejecuto:
service synpipe_server start
Pero esto es lo que obtengo en su lugar:
[root@master 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 ]
[root@master init.d]#
Entonces, inicia el script de Perl pero lo ejecuta sin separarlo de la sesión de 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, el demonio no devuelve pid ).
¿Alguien tiene alguna idea de lo que estoy haciendo mal?
EDITAR: tal vez debería decir que estoy en una máquina Red Hat.
Scientific Linux SL release 5.4 (Boron)
¿Funcionaría si en lugar de usar la función daemon, uso algo como:
nohup ${exe} >/dev/null 2>&1 &
en el guión de inicio?
daemon
y en sukillproc
lugar