Der Aufruf des Daemons in einem Skript /etc/init.d wird blockiert und nicht im Hintergrund ausgeführt


9

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

Antworten:


4

Ich schlage vor, dass Sie das Perl-Skript direkt dämonisieren, anstatt die zusätzliche Ebene der Redhat-Init-Skriptfunktion hinzuzufügen daemon. Es ist schwer, Dämonen richtig zu machen, wenn Sie versuchen, sie selbst zu schreiben. Proc :: Daemon ist ziemlich einfach.

Hier ist auch eine Diskussion darüber, wie man Perl-Daemons schreibt .

Bonusantwort : Verwenden Sie Daemontools und Proc :: Daemontools . Das bietet ein umfassendes Daemon-Management-System und Sie haben wahrscheinlich sowieso schon Daemontools installiert. Einige Leute mögen keine Daemontools, aber es erledigt den Job.

Egal wie oft ich Daemon schreibe, es scheint immer noch seltsam. Vielleicht sollte ich einfach dæmon verwenden.


2

Wenn Sie Debian und seine Derivate verwenden, können start-stop-daemonSie den Prozess mit der Option -b problemlos starten.


Dies ist RedHat Maschine, sollte also verwenden daemonund killprocstattdessen
MariuszS

1
Dies hat mein Problem heute gelöst. In Ubuntu habe ich /etc/init.d/skeleton kopiert und konnte nicht herausfinden, warum es nicht im Hintergrund lief. Ich nahm an, dass es bereits für den Hintergrund eingerichtet war, aber es stellt sich heraus, dass dies nicht der Fall ist.
Ryan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.