La chiamata al demone in uno script /etc/init.d è bloccata, non in esecuzione in background


9

Ho uno script Perl che voglio demonizzare. Fondamentalmente questo script perl leggerà una directory ogni 30 secondi, leggerà i file che trova e quindi elaborerà i dati. Per semplicità, considera il seguente script Perl (chiamato synpipe_server, c'è un link simbolico di questo script in /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;
}

Quindi questo script fondamentalmente stampa qualcosa ogni 3 secondi.

Quindi, poiché voglio demonizzare questo script, ho inserito anche questo script bash (chiamato anche synpipe_server) 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

Quindi, (se ho ben compreso il documento per demone) lo script Perl dovrebbe essere eseguito in background e l'output dovrebbe essere reindirizzato a /dev/nullse eseguo:

service synpipe_server start

Ma ecco cosa ottengo invece:

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

Quindi avvia lo script Perl ma lo esegue senza staccarlo dalla sessione terminale corrente e posso vedere l'output stampato nella mia console ... che non è proprio quello che mi aspettavo. Inoltre, il file PID è vuoto (o solo con un avanzamento riga, nessun pid restituito dal demone ).

Qualcuno ha idea di cosa sto facendo di sbagliato?

EDIT: forse dovrei dire che sono su una macchina Red Hat.

Scientific Linux SL release 5.4 (Boron)

Farebbe il lavoro se invece di usare la funzione demone, uso qualcosa del tipo:

nohup ${exe} >/dev/null 2>&1 &

nello script di init?

Risposte:


4

Ti suggerisco di demonizzare direttamente lo script perl invece di aggiungere il livello aggiuntivo della daemonfunzione di script init redhat . È difficile ottenere i demoni giusti se provi a scriverli da soli. Proc :: Daemon è piuttosto semplice.

Inoltre, ecco una discussione su come scrivere i demoni perl .

Risposta bonus: usa daemontools e Proc :: Daemontools . Ciò fornisce un sistema di gestione dei demoni completo e probabilmente hai già installato i daemontools. Ad alcune persone non piacciono i daemontools ma riesce a fare il lavoro.

Non importa quante volte scrivo il demone sembra ancora strano. Forse dovrei usare solo Dæmon.


2

Se stai usando Debian e i suoi derivati, usa l' start-stop-daemonopzione -b per avviare il tuo processo senza problemi.


Questa è una macchina RedHat, quindi dovrebbe usare daemone killprocinvece
MariuszS

1
Questo ha risolto il mio problema oggi. In Ubuntu, ho copiato /etc/init.d/skeleton e non sono riuscito a capire perché non fosse in esecuzione in background. Ho pensato che fosse già impostato per lo sfondo, ma risulta che non lo è.
Ryan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.