Виклик демона в сценарії /etc/init.d блокується, не працює у фоновому режимі


9

У мене є сценарій 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 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;
}

Тож цей сценарій в основному друкує щось кожні 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 "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status ${pname}
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
    ;; esac

exit 0

Отже, (якщо я добре зрозумів документ для демона), скрипт 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)

Зробив би це, якщо замість функції демона я використовую щось на зразок:

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

в сценарії init?

Відповіді:


4

Я пропоную вам демонізувати сценарій perl безпосередньо замість того, щоб додавати додатковий шар daemonфункції сценарію redhat init . Важко правильно підібрати демони, якщо ви спробуєте написати їх самостійно. Proc :: Daemon досить простий.

Крім того, ось дискусія про те, як писати демони Perl .

Бонусна відповідь: використовуйте daemontools та Proc :: Daemontools . Це забезпечує всебічну систему управління демонами, і ви, мабуть, уже встановили daemontools. Деякі люди не люблять демонтів, але це робить роботу.

Незалежно від того, скільки разів я пишу демон, все ще здається дивним. Можливо, я повинен просто використовувати dæmon.


2

Якщо ви використовуєте Debian та його похідні, скористайтеся start-stop-daemonопцією -b, щоб без проблем запустити процес.


Це машина RedHat, тому її слід використовувати daemonі killprocзамість цього
MariuszS

1
Це сьогодні вирішило моє питання. В Ubuntu я скопіював /etc/init.d/skeleton і не зміг зрозуміти, чому він не працює у фоновому режимі. Я припускав, що це вже створено для тла, але виявляється, що це не так.
Райан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.