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?

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.


2

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.