A chamada para o daemon em um script /etc/init.d está bloqueando, não sendo executada em segundo plano

9

Eu tenho um script Perl que eu quero daemonize. Basicamente, esse script perl lê um diretório a cada 30 segundos, lê os arquivos encontrados e processa os dados. Para simplificar aqui, considere o seguinte script Perl (chamado synpipe_server, existe um link simbólico desse script /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;
}

Portanto, esse script basicamente imprime algo a cada 3 segundos.

Então, como eu quero daemonizar esse script, eu também coloquei esse script bash (também chamado synpipe_server) em /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

Portanto, (se eu entendi bem o doc para daemon), o script Perl deve ser executado em segundo plano e a saída deve ser redirecionada para /dev/nullse eu executar:

service synpipe_server start

Mas aqui está o que eu recebo:

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

Então, ele inicia o script Perl, mas o executa sem desconectá-lo da sessão atual do terminal, e eu posso ver a saída impressa no meu console ... o que não é realmente o que eu estava esperando. Além disso, o arquivo PID está vazio (ou apenas com um feed de linha, nenhum pid retornado pelo daemon ).

Alguém tem alguma idéia do que estou fazendo de errado?

EDIT: talvez eu deva dizer que estou em uma máquina Red Hat.

Scientific Linux SL release 5.4 (Boron)

Faria o trabalho se, em vez de usar a função daemon, eu usasse algo como:

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

no script init?

Tony
fonte

Respostas:

4

Sugiro que você daemonize o script perl diretamente, em vez de adicionar a camada extra da daemonfunção de script redhat init . É difícil acertar os daemons se você tentar escrevê-los por conta própria. Proc :: Daemon é bem direto.

Além disso, aqui está uma discussão sobre como escrever perl daemons .

Resposta de bônus: use daemontools e Proc :: Daemontools . Isso fornece um sistema abrangente de gerenciamento de daemon e você provavelmente já tem daemontools instalados de qualquer maneira. Algumas pessoas não gostam de daemontools, mas isso faz o trabalho.

Não importa quantas vezes eu escreva daemon ainda parece estranho. Talvez eu deva apenas usar daemon.

Phil Hollenback
fonte
2

Se você estiver usando o Debian e seus derivados, use start-stop-daemoncom a opção -b para iniciar seu processo sem problemas.

Dom
fonte
Esta é máquina RedHat, então deve usar daemone killprocem vez disso
MariuszS
1
Isso resolveu meu problema hoje. No Ubuntu, copiei o /etc/init.d/skeleton e não consegui descobrir por que não estava sendo executado em segundo plano. Eu assumi que já estava configurado para segundo plano, mas acontece que não é.
Ryan