为什么我的程序在使用Proc :: Daemon时没有写入文件?

时间:2009-08-16 15:43:30

标签: perl daemon

我在使用Proc::Daemon之前编写了一些测试代码,我的测试代码是什么:

#! /usr/bin/perl

use strict;
use warnings;
use Proc::Daemon;

Proc::Daemon::Init();
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 ; }

while ( $continue ) {
    sleep(5) ;
    &greeting ;
}

sub greeting {
    open ( FH, ">>/home/daogu/foo" ) or die "can't open it" ;
    print FH "hello word\n" ;
    close FH ;
}

在我启动玩具守护程序后,我发现实际上没有写入“foo”。任何人都可以解释为什么会这样?感谢。

2 个答案:

答案 0 :(得分:7)

首先,您需要使用分号来终止第9行的分配:

$SIG{TERM} = sub { $continue = 0 ; };

在我添加之前,你的程序甚至都不会运行,所以我猜你在脚本中有这个并且错过了它。

除此之外,我怀疑Guss是对的,你有权限问题。这是一种检查方式。打开一个单独的终端并运行top。启动守护程序脚本,您将看到Perl进程显示。如果问题是权限,您将很快看到Perl进程消失。脚本在子例程中死亡,但是由于守护程序在此时无法访问您的终端,因此您尝试使用有用的错误消息永远不会显示。

更改此测试的一种快捷方法是在子例程中将die更改为warn。如果这样做,守护程序将继续运行(检查运行top的终端以确认这一点)。但如果问题是权限,那么仍然将不会看到创建或写入文件。

编辑:是的,权限有问题+无权访问STDERR =一个死的,无声的守护进程。试试这个版本,但要确保可以写入您为STDERR切换的日志:

Proc::Daemon::Init();
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 ; };

while ( $continue ) {
    sleep(5);
    greeting();
}

sub greeting {
    open STDERR, '>>', '/Users/telemachus/log'
        or die "Can't reopen STDERR to log: $!";
    open my $fh, '>>', '/usr/local/foo'
        or warn "Can't open /usr/local/foo for writing: $!";
    print $fh "hello word\n";
    close $fh;
}

您可能会在日志中看到很多这样的内容:

  

无法打开foo进行写入:守护程序第21行的权限被拒绝。   在守护程序第22行的封闭文件句柄$ fh上打印()。

答案 1 :(得分:3)

你的脚本对我来说很好看。问题很可能只是文件权限 - 确保您对应该创建文件的目录具有写入权限,或者如果文件已经存在,则您具有对文件本身的写入权限。

我在我的机器上运行你的脚本,它运行正常。