Вызов демона В a/etc / init.D скрипт блокируется, не работает в фоновом режиме

у меня есть сценарий Perl, который я хочу демонизировать. В основном этот скрипт perl будет читать каталог каждые 30 секунд, читать файлы, которые он находит, а затем обрабатывать данные. Чтобы все было просто, рассмотрим следующий скрипт Perl (называемый synpipe_server, в /usr/sbin/):

#!/usr/bin/perl
use strict;
use warnings;

my $continue = 1;
$SIG{'TERM'}  = sub { $continue = 0; print "Caught TERM signaln"; };
$SIG{'INT'} = sub { $continue = 0; print "Caught INT signaln"; };

my $i = 0;
while ($continue) {
     #do stuff
     print "Hello, I am running " . ++$i . "n";
     sleep 3;
}

таким образом, этот скрипт в основном печатает что-то каждые 3 секунды.

затем, поскольку я хочу демонизировать этот сценарий, я также поставил этот сценарий bash (также называется synpipe_server) в /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 "" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status ${pname}
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
    ;; esac

exit 0

Итак, (если я хорошо понял doc для демона) скрипт Perl должен работать в фоновом режиме, а вывод должен быть перенаправлен на /dev/null если я исполняю :

service synpipe_server start

но вот что я получаю вместо этого:

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

таким образом, он запускает скрипт Perl, но запускает его без отсоединения от текущего сеанса терминала, и я вижу вывод, напечатанный в моей консоли ... на самом деле я был не таким. ожидающий. Кроме того, PID-файл пуст (или только с лентой строки, без pid, возвращаемого демон).

кто-нибудь имеет представление о том, что я делаю неправильно ?

EDIT: может быть, я должен сказать, что я на машине Red Hat.

Scientific Linux SL release 5.4 (Boron)

спасибо, Тони!--9-->

4 ответов


я, наконец, переписал функцию запуска в сценарии инициализации bash, и я не использую


правильный способ демонизации процесса-отсоединить его от терминала сама по себе. Вот как это делают большинство больших наборов программного обеспечения, например,apache.

обоснование daemon не делать то, что вы ожидаете от его имени, и как сделать процесс unix отсоединиться в фоновом режиме, можно найти здесь в разделе 1.7 как заставить мою программу действовать как демон?

просто вызов программы в фоновом режиме не совсем адекватной эти длительные программы; это не правильно отсоединяет процесс из терминального сеанса, который его запустил. Также обычный способ запуска демонов - просто отдать команду вручную или из rc-скрипта; ожидается, что демон поставит в фон.

для дальнейшего чтения по этой теме: в чем разница между nohup и a Деймон?


По данным man daemon правильный синтаксис

daemon [options] -- [command] [command args]

ваш стартап скрипт должен работать примерно так:

daemon --pidfile ${pidfile} -- ${exe}

Как сказал здесь Кажется, что процесс должен быть направлен на фон, используя &. Деймон не делает это за тебя.