我有一个Perl脚本,我想要守护进程。基本上这个Perl脚本会每隔30秒读取一个目录,读取它找到的文件,然后处理数据。为了保持它的简单这里考虑以下的Perl脚本(称为synpipe_server,有这个脚本的/usr/sbin/
符号链接):在/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;
}
所以这个剧本基本上打印每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
所以,(如果我有很好的理解进行守护的DOC) 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)。
有没有人有任何想法我做错了什么?
编辑:也许我应该说我在红帽机器上。
Scientific Linux SL release 5.4 (Boron)
感谢, 托尼
而不是写一个守护进程来轮询更改,你可以使用的inotify http://en.wikipedia.org/wiki/Inotify更改时通知你已经发生了。编码更容易,效率更高,并且可以更快地看到更新。有许多CPAN模块可以与之交谈。 http://search.cpan.org/search?query=inotify&mode=all – Schwern
谢谢,这是有用的信息,我一定会看看Inotify。 – tony
@Schwern:这并不改变我必须在后台运行守护进程等待inotify通知的事实,否? – tony