gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:54:04 25 4
gpt4 key购买 nike

我在使用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”。有人可以解释为什么会发生这种情况吗?谢谢。

最佳答案

首先,您需要一个分号来终止第 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;
}

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

Can't open foo for writing: Permission denied at daemon line 21. print() on closed filehandle $fh at daemon line 22.

关于perl - 为什么我的程序在使用 Proc::Daemon 时不写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com