Ich habe ein Perl-Skript, das ich dämonisieren möchte. Grundsätzlich liest dieses Perl-Skript alle 30 Sekunden ein Verzeichnis, liest die gefundenen Dateien und verarbeitet dann die Daten. Um es hier einfach zu halten, betrachten Sie das folgende Perl-Skript (synpipe_server genannt, in dem sich ein symbolischer Link zu diesem Skript befindet /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;
}
Dieses Skript druckt also grundsätzlich alle 3 Sekunden etwas.
Da ich dieses Skript dämonisieren möchte, habe ich auch dieses Bash-Skript (auch synpipe_server genannt) eingefügt in /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
Wenn ich das Dokument für den Daemon gut verstanden habe, sollte das Perl-Skript im Hintergrund ausgeführt werden und die Ausgabe sollte umgeleitet werden, /dev/null
wenn ich Folgendes ausführe:
service synpipe_server start
Aber hier ist was ich stattdessen bekomme:
[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]#
Es startet also das Perl-Skript, führt es jedoch aus, ohne es von der aktuellen Terminalsitzung zu trennen, und ich kann die Ausgabe in meiner Konsole sehen ... was nicht wirklich das ist, was ich erwartet hatte. Darüber hinaus ist die PID-Datei leer (oder nur mit einem Zeilenvorschub, keine vom Daemon zurückgegebene PID ).
Hat jemand eine Vorstellung davon, was ich falsch mache?
EDIT: Vielleicht sollte ich sagen, dass ich auf einem Red Hat-Computer bin.
Scientific Linux SL release 5.4 (Boron)
Würde es den Job machen, wenn ich anstelle der Daemon-Funktion etwas verwenden würde wie:
nohup ${exe} >/dev/null 2>&1 &
im Init-Skript?
daemon
undkillproc
stattdessen