2011-11-14 10 views
21

私はデーモン化したいPerlスクリプトを持っています。基本的に、このperlスクリプトは30秒ごとにディレクトリを読み込み、見つかったファイルを読み込んで処理します。したがって、このスクリプトは基本的に何かを3秒ごとに出力します/etc/init.dスクリプト内のデーモンへの呼び出しがブロックされ、バックグラウンドで実行されていません

#!/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; 
} 

:それは、単純なここに次のPerlスクリプトを検討し維持するために(synpipe_serverと呼ばれるが、/usr/sbin/でこのスクリプトのシンボリックリンクがあります)。

#!/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 

ので、(私が持っている場合もデーモンのドキュメントを理解):私はこのスクリプトをデーモン化したいと

その後、私はまた/etc/init.d/にこのbashスクリプト(とも呼ばれるsynpipe_server)を入れていますPerlスクリプトは、バックグラウンドで実行する必要があり、私は実行すると、出力は/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スクリプトを起動しますが、現在のターミナルセッションから切り離すことなく実行します。私のコンソールには出力が表示されていますが、これは私が期待していたものではありません。さらに、PIDファイルは空である(または改行のみで、デーモンによって返されたPIDはない)。

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

EDIT:おそらく私はRed Hatマシン上にいると言わなければなりません。

Scientific Linux SL release 5.4 (Boron) 

おかげで、 トニー

+3

代わりの変更をポーリングするデーモンを書いて、あなたは時に変更を通知するhttp://en.wikipedia.org/wiki/Inotifyをinotifyを使用することができます起こった。より簡単にコードを作成でき、より効率的で、更新プログラムをより速く見ることができます。それと対話するための数多くのCPANモジュールがあります。 http://search.cpan.org/search?query=inotify&mode=all – Schwern

+0

ありがとう、これは有用な情報ですが、私は間違いなくInotifyを見ていきます。 – tony

+0

@Schwern:それは、私がinotify通知を待っているバックグラウンドでデーモンを動かさなければならないという事実を変えないのですか? – tony

答えて

15

を私は最終的に再書いbashのinitスクリプトで関数を開始します。私はを使用していません。もう。

私はpidファイルが既に存在しないことを確認します(もしそうならば、警告を書きます)。そうでない場合は、

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

を使用してスクリプトを開始します。

このように安全かどうかわかりませんが(?)動作します。

+2

私は似たようなものを使用しましたが、スクリプトが起動されたときに表示される出力を提供するために 'daemon'をnohupとともに使用しました。 'daemon 'nohup $ {exe}>/dev/null 2>&1&" &&' ' [OK]メッセージはいつもOKに戻るので、何か他の視覚的な手掛かりです。例として を参照してください。 – Rohaq

+0

tony、あなたのシェルが終了したときにこのデーモンが死ぬことはありませんか?それともnohupはそれを防ぐのですか? – Mark

+0

はい、シェルが終了すると、nohupによって作成されたプロセスはそのまま残ります。 – tony

0

man daemon正しい構文によると、あなたのinitスクリプトの起動のようなものを実行する必要があり

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

です:

daemon --pidfile ${pidfile} -- ${exe} 
+3

ykoさんありがとうございます。しかし、私の 'daemon'の使用法は 'daemon [+/- nicelevel] {program}'と言っているのでこれではありません。おそらく、我々は同じバージョンを持っていないでしょう。 – tony

+0

@tonyコマンドの使用上の問題を解決できましたか? –

+0

@tony [daemon from libslack](http://libslack.org/daemon/#download)をインストールしました –

0

hereと同様に、&を使用してプロセスをバックグラウンドに送信する必要があるようです。 デーモンはそれをしません。

1

プロセスをデーモン化する適切な方法は、端末自身をから切り離すことです。これは、大規模なソフトウェアスイートがそれを行う方法です(たとえば、apache)。

daemonの理論的根拠は、あなたがその名前から期待何をやっていない、とどのようにするには、UNIXのプロセスは切り離し背景に、私は私のプログラムは、デーモンのように行動してもらうにはどうすればよいのセクション1.7でhereを見つけることができますか?

単にバックグラウンドでプログラムを起動することは これらの長時間実行するプログラムのために本当に十分ではありません。そのプロセスを起動した端末セッションから正しく切断されません。また、 デーモンを起動する従来の方法は、コマンド を手動またはrcスクリプトから発行するだけです。デーモンは自体を とバックグラウンドに入れています。さらにこのトピックの読書のために

What's the difference between nohup and a daemon?

関連する問題