/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ファイルは空です(または改行のみの場合、daemonから pidは返されません)。

誰かが私が間違っていることを知っていますか?

編集:たぶん私はRed Hatマシンを使用していると言う必要があります。

Scientific Linux SL release 5.4 (Boron)

デーモン機能を使用する代わりに、私は次のようなものを使用した場合、それは仕事をしますか?

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

initスクリプトで?

回答:


4

redhat initスクリプトdaemon関数の追加の層を追加する代わりに、perlスクリプトを直接デーモン化することをお勧めします。デーモンを自分で書こうとすると、デーモンを正しく取得するのは困難です。Proc :: Daemonはかなり単純です。

また、perlデーモンの作成方法についても説明します

おまけの回答:daemontoolsProc :: Daemontoolsを使用してください。それは包括的なデーモン管理システムを提供し、おそらくすでにとにかくデーモンツールがインストールされています。一部の人々はdaemontoolsを嫌いますが、それは仕事を成し遂げます。

デーモンを何回書いても変な感じがします。多分私はデーモンを使用する必要があります。


2

Debianとその派生物を使用start-stop-daemonしている場合は、-bオプションを使用して問題なくプロセスを開始します。


これはRedHatマシンなのでdaemonkillproc代わりに使用する必要があります
MariuszS

1
これで今日の私の問題は解決しました。Ubuntuでは、/ etc / init.d / skeletonをコピーしましたが、バックグラウンドで実行されていない理由を理解できませんでした。すでにバックグラウンド用に設定されていると思いましたが、そうではありません。
ライアン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.