私はデーモン化したい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)
おかげで、 トニー
代わりの変更をポーリングするデーモンを書いて、あなたは時に変更を通知するhttp://en.wikipedia.org/wiki/Inotifyをinotifyを使用することができます起こった。より簡単にコードを作成でき、より効率的で、更新プログラムをより速く見ることができます。それと対話するための数多くのCPANモジュールがあります。 http://search.cpan.org/search?query=inotify&mode=all – Schwern
ありがとう、これは有用な情報ですが、私は間違いなくInotifyを見ていきます。 – tony
@Schwern:それは、私がinotify通知を待っているバックグラウンドでデーモンを動かさなければならないという事実を変えないのですか? – tony