Подтвердить что ты не робот

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

У меня есть Perl script, который я хочу демонзировать. В основном это perl script будет читать каталог каждые 30 секунд, читать файлы, которые он находит, а затем обрабатывать данные. Чтобы упростить здесь, рассмотрим следующий Perl script (называемый synpipe_server, существует символическая ссылка этого 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;
}

Итак, этот script в основном печатает что-то каждые 3 секунды.

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

exit 0

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

service synpipe_server start

Но вот что я получаю вместо:

[[email protected] 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  ]
[[email protected] init.d]# 

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

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

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

Scientific Linux SL release 5.4 (Boron)

Спасибо, Тони

4b9b3361

Ответ 1

Я, наконец, перезаписал функцию запуска в bash init script, и я больше не использую daemon.

start() {
    echo -n "Starting $pname : "
    #daemon ${exe} # Not working ...
    if [ -s ${pidfile} ]; then
       RETVAL=1
       echo -n "Already running !" && warning
       echo
    else
       nohup ${exe} >/dev/null 2>&1 &
       RETVAL=$?
       PID=$!
       [ $RETVAL -eq 0 ] && touch ${lockfile} && success || failure
       echo
       echo $PID > ${pidfile}
    fi
}

Я проверяю, что файл pid уже не существует (если это так, просто напишите предупреждение). Если нет, я использую

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

чтобы запустить script.

Я не знаю, безопасно ли это (?), но оно работает.

Ответ 2

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

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

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

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

Ответ 3

В соответствии с man daemon правильный синтаксис

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

Запуск при запуске script должен запускаться примерно так:

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

Ответ 4

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