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.
Vous devez vous connecter pour publier un commentaire.
J'ai enfin re-écrit la fonction de démarrage dans le bash script d'initialisation, et je ne suis pas à l'aide de
daemon
plus.Je vérifie que le fichier pid n'est pas existant déjà (si si, il suffit d'écrire un message d'avertissement). Sinon, j'utilise
pour lancer le script.
Je ne sais pas si il est sûr de cette façon (?) mais il fonctionne.
daemon
aux côtés de nohup pour fournir un résultat affiché lorsque le script a été lancé. C'est plus un repère visuel qu'autre chose, puisque le [OK] message retournera toujours OK aussi longtemps que nohup a exécuter:daemon "nohup ${exe} >/dev/null 2>&1 &"
comme un exemple.daemon "nohup $exe 0<&- &>/dev/null &"
.La bonne façon de daemonize un processus est ont il se détacher du terminal par lui-même. C'est la façon dont la plupart des grandes suites logicielles de le faire, par exemple, apache.
De la justification de l'
daemon
ne pas faire ce que vous attendez de son nom, et comment faire un processus unix détacher dans le fond, peut être trouvé ici dans la section 1.7 Comment puis-je obtenir mon programme pour agir comme un démon?Pour en savoir plus sur ce sujet: Quelle est la différence entre nohup et un démon?
Selon
man daemon
syntaxe correcte estVotre script de démarrage devrait lancer quelque chose comme:
daemon [+/-nicelevel] {program}
. Peut-être que nous n'avons pas la même version.deamon
@tony fait référence est celle déclarée par/etc/rc.d/init.d/functions
Comme l'a dit ici, il semble que le processus doit être envoyé à l'arrière-plan à l'aide de &.
Démon de ne pas le faire pour vous.