Call to daemon en un script /etc/init.d está bloqueando, no se ejecuta en segundo plano

9

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/nullsi 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?

Tony
fuente

Respuestas:

4

Le sugiero que demonice el script perl directamente en lugar de agregar la capa adicional de la daemonfunción de script redhat init . Es difícil obtener demonios correctamente si intentas escribirlos por tu cuenta. Proc :: Daemon es bastante sencillo.

Además, aquí hay una discusión sobre cómo escribir demonios perl .

Respuesta adicional : use daemontools y Proc :: Daemontools . Eso proporciona un sistema integral de administración de demonios y de todos modos probablemente ya tenga instaladas las herramientas de demonio. A algunas personas no les gustan las herramientas demoníacas, pero hace el trabajo.

No importa cuántas veces escriba daemon, todavía parece extraño. Tal vez debería usar dæmon.

Phil Hollenback
fuente
2

Si está utilizando Debian y sus derivados, use la start-stop-daemonopción -b para iniciar su proceso sin problemas.

Dom
fuente
Esta es la máquina RedHat, por lo que debería usar daemony en su killproclugar
MariuszS
1
Esto resolvió mi problema hoy. En Ubuntu, copié /etc/init.d/skeleton y no pude entender por qué no se estaba ejecutando en segundo plano. Supuse que ya estaba configurado para el fondo, pero resulta que no lo está.
Ryan