这是我的密码:
if ($DAEMON) {
my $pid = fork();
if (not defined $pid) {
print "Unable to start daemon.\n";
exit(1);
}
elsif ($pid == 0) {
open STDOUT, '>', '/dev/null';
open STDERR, '>', '/dev/null';
_create_sessions($self, $settings);
$poe_kernel->run;
}
else { print "Script forked to background with PID $pid\n"; }
}
else {
_create_sessions($self, $settings);
$poe_kernel->run;
}当$DAEMON =1时,它会抱怨POE::内核的run()方法从未被调用,但是正如您在上面的代码中看到的那样,我已经这样做了。在守护进程模式下,脚本运行得非常好,但我无法摆脱这个警告,也无法理解它为什么这么说。我还试着调用$poe_ make >has(),这也没有什么区别。
我没有主意了。有什么建议吗?
更新为添加:也许我不够清楚。下面的代码创建会话并运行内核。
_create_sessions($self, $settings);
$poe_kernel->run;它工作得很好。只有当相同的代码在叉子内部运行以便我可以将脚本发送到后台时,它才会声明POE::内核的run方法没有被调用。脚本确实会进入后台,并按应有的方式工作,这意味着内核确实在运行。我只想摆脱那个恼人的警告。
发布于 2011-01-01 08:05:53
是对的。之所以会出现警告,是因为POE::Session实例是在父进程中创建的,但没有给它们运行的机会。
% perl -wle 'use POE; POE::Session->create(inline_states=>{_start => sub {}})'
40023: Sessions were started, but POE::Kernel's run() method was never
40023: called to execute them. This usually happens because an error
40023: occurred before POE::Kernel->run() could be called. Please fix
40023: any errors above this notice, and be sure that POE::Kernel->run()
40023: is called. See documentation for POE::Kernel's run() method for
40023: another way to disable this warning.在上面的示例中,40023是检测到问题的进程ID。
它类似于Perl关于使用活动线程退出的警告:
% perl -wle 'use threads; threads->create(sub { sleep 3600 }); '
Perl exited with active threads:
1 running and unjoined
0 finished and unjoined
0 running and detached虽然您的代码片段显示会话是在子进程中创建和运行的,但我怀疑会话是在创建之前或之后创建的。父进程不会在您的代码段中退出,因此无法知道执行之后将如何执行?
您还应该在子进程中调用POE::内核->has()。我不知道这是否发生在您的代码片段中。
正确的解决方案是在去功能化时将所有会话实例化移动到子进程中。一个可行的解决方法是在使用POE::内核之后,在实际创建任何会话之前调用POE::内核->run()。run()将立即返回,因为不存在会话,但是调用满足了警告您的条件。这是一种说“是的,是的,但我知道我在做什么”的方式。
发布于 2010-12-31 17:57:43
从文件POE::内核的运行通常被称为一个类方法;什么是$poe_kernel?
在某个地方,您似乎要启动一个会话,但不要以调用POE::内核->run()结束;
更新:由于您看到的消息是带有warn的输出,并且在子节点中丢弃了STDERR,所以我猜这是发出警告的父消息。您正在做的事情(在代码中没有显示加载POE并设置$poe_kernel?)实际上是在创建一个会话,显然是无意的。
尝试将您的代码简化为一个简短但可运行的示例,您将自己发现问题,或者让其他人帮助您找到它。
https://stackoverflow.com/questions/4571307
复制相似问题