首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我的程序在使用Proc::Daemon时不能写入文件?

为什么我的程序在使用Proc::Daemon时不能写入文件?
EN

Stack Overflow用户
提问于 2009-08-16 15:43:30
回答 2查看 1.2K关注 0票数 3

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

代码语言:javascript
运行
复制
#! /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“。有人能解释一下为什么会发生这种情况吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-16 16:26:04

首先,您需要一个分号来终止第9行的赋值:

代码语言:javascript
运行
复制
$SIG{TERM} = sub { $continue = 0 ; };

在我添加它之前,您的程序甚至不会运行,所以我猜您在脚本中已经有了它,但在这里遗漏了它。

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

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

编辑:是的,权限问题+无法访问STDERR =一个死掉的、静默的守护进程。尝试此版本,但请确保您可以写入您为STDERR切换的日志:

代码语言:javascript
运行
复制
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上使用print()。

票数 7
EN

Stack Overflow用户

发布于 2009-08-16 15:55:47

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

我在我的机器上运行你的脚本,它工作得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1284578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档