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.