J'ai un script Perl que je veux démonifier. Fondamentalement, ce script perl lira un répertoire toutes les 30 secondes, lira les fichiers qu'il trouve et traitera les données. Pour rester simple ici, considérons le script Perl suivant (appelé synpipe_server, il y a 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;
}
Ce script imprime donc quelque chose toutes les 3 secondes.
Ensuite, comme je veux démonifier ce script, j'ai également 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 le démon), le script Perl devrait s'exécuter en arrière-plan et la sortie devrait être redirigée /dev/null
si j'exécute:
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]#
Donc, il démarre le script Perl mais l'exécute sans le détacher de la session terminale actuelle, et je peux voir la sortie imprimée dans ma console ... ce qui n'est pas vraiment ce que j'attendais. De plus, le fichier PID est vide (ou avec un saut de ligne uniquement, aucun pid retourné par le démon ).
Quelqu'un at-il une idée de ce que je fais mal?
EDIT: je devrais peut-être dire que je suis sur une machine Red Hat.
Scientific Linux SL release 5.4 (Boron)
Est-ce que cela ferait l'affaire si au lieu d'utiliser la fonction démon, j'utilise quelque chose comme:
nohup ${exe} >/dev/null 2>&1 &
dans le script init?
daemon
et à lakillproc
place