Appel à démon dans un /etc/init.d script bloque, pas en cours d'exécution en arrière-plan

J'ai un script Perl que je veux daemonize. Fondamentalement, ce script perl va lire un répertoire de toutes les 30 secondes, lire les fichiers qu'il trouve, puis de traiter les données. Pour garder les choses simples considère ici le script Perl suivant (appelé synpipe_server, il existe un lien symbolique de ce script dans /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;
}

Donc ce script fondamentalement imprime quelque chose toutes les 3 secondes.

Puis, comme je veux daemonize ce script, j'ai aussi mis ce script bash (également appelé synpipe_server) dans /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

Donc, (si j'ai bien compris la doc pour daemon) Perl script doit s'exécuter en arrière-plan et la sortie doit être redirigé vers /dev/null si j'execute :

service synpipe_server start

Mais voici ce que j'obtiens à la place :

[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]# 

Afin de lancer le script Perl mais l'exécute sans se détacher de l'actuelle session de terminal, et je peux voir la sortie imprimée dans ma console ... ce qui n'est pas vraiment ce que j'attendais. En outre, le fichier PID est vide (ou avec un saut de ligne, pas de pid retourné par démon).

Quelqu'un a une idée de ce que je fais de mal ?

EDIT : je devrais peut-être dire que je suis sur une Red Hat machine.

Scientific Linux SL release 5.4 (Boron)

Grâce,
Tony

  • Au lieu d'écrire un démon de sondage pour les modifications, vous pouvez utiliser inotify en.wikipedia.org/wiki/Inotify pour vous informer qu'un changement s'est produit. Il est plus facile de code, plus efficace, et vous pouvez voir les mises à jour plus rapide. Il y a un certain nombre de modules CPAN pour parler avec elle. search.cpan.org/search?query=inotify&mode=all
  • Merci, c'est utile info, je vais certainement avoir un regard sur Inotify.
  • cela ne change pas le fait que je dois exécuter un démon dans le fond d'attente pour inotify notifications, non???
  • C'est vrai. Je ne peux pas vous aider avec les détails du démon commande sur Redhat. Il diffère d'un système à l'autre.
InformationsquelleAutor tony | 2011-11-14