Syslog

使用Proc::Daemon可以非常方便的写一个daemon程序,可是这样的程序看不见、摸不着,我们怎样才能知道它干了什么呢?最简单的方法是维护一个日志文件,向里面输出一些动作记录,以便跟踪和调试;更通用的方法是使用syslog,daemon程序只需把日志信息传给syslogd(也是一个daemon),syslogd则负责把不同程序的日志信息存到相应的日志文件里。

Cygwin里面也带有syslogd,运行syslogd-config就把syslogd安装为Windows Service,首次安装后要手工打开该服务才能够使用。

Perl脚本可以使用Unix::Syslog向syslogd发送日志信息。下面的程序是一个简单的例子:

#!/usr/bin/perl
use Unix::Syslog qw(:macros);
use Unix::Syslog qw(:subs);
openlog("hello.pl", LOG_PERROR|LOG_CONS, LOG_LOCAL7);
syslog(LOG_INFO, "hello, world");
closelog;

缺省的(在/etc/syslog.conf里面设置),日志信息输出到/var/log/messages,运行上面的程序后,该文件里会增加一条信息,类似于:

Sep 12 13:09:35 machine-name hello.pl: hello, world

通过修改/etc/syslog.conf文件,我们可以将不同程序的日志信息存放到不同的日志文件里,具体操作参见man syslog.conf

Daemon

使用Proc::Daemon可以把Perl脚本变成一个Daemon。用法很简单:

#!/usr/bin/perl
use Proc::Daemon;
Proc::Daemon::Init;
# your program goes here

我们可以做一个简单的测试,把下面的程序存为daemon.pl

#!/usr/bin/perl
use Proc::Daemon;
Proc::Daemon::Init;
open LOG, ">/home/yourname/log";
print LOG "Process Id is $$.n";
close LOG;
sleep 100;

然后开两个shell,在一个shell里面运行perl daemon.pl,当再次出现提示符时,退出这个shell,换到另一个shell,从log文件里查看daemon的进程号,然后运行ps确认该进程仍在运行。

通常来讲daemon要一直运行,所以程序里应该有个类似死循环之类的结构,这里是一个真实的例子