1

我一直在使用Daemon::Simple快速守护一些脚本并使它们能够启动/停止。但是,其中一些脚本是用 python 编写的,所以我通常称之为Daemon::Simple::Init()pythonexec()脚本。

但是,我发现Daemon::Simple::Init()关闭STDOUTand STDERR,并且似乎因此 python 脚本在写入STDOUTand时中断(只是退出) STDERR。在执行之前重新打开STDOUT并将STDERR它们重定向到文件没有帮助。

我发现确实有帮助的是改变来源Daemon::Simple

close(STDOUT);
close(STDERR);

至:

open STDOUT, "/dev/null"
open STDERR, "/dev/null"

如果我在像以前一样调用之后再次打开STDOUT并将STDERR它们重定向到真实文件Daemon::Simple:Init(),这一次它可以工作。似乎关闭STDOUTSTDERR重新打开以某种方式破坏了它们exec(),但打开它们/dev/null并重新打开它们工作正常。

无论如何,我可以重新打开或保持打开状态STDOUT,而STDERR无需修改Daemon::Simple哪个幸存下来exec()

4

2 回答 2

3

您尝试重新打开 STDERR 和 STDOUT 时使用的行是否相同?如果是这样,问题很可能是您打开它们是为了阅读而不是为了写作。尝试使用

open STDOUT, '>', '/dev/null';
于 2012-11-20T15:11:38.273 回答
1

这对你有用吗?

use Daemon::Simple;

open(SAVEOUT, ">&STDOUT");
open(SAVEIN, "<&STDIN");

Daemon::Simple::init("daemon");

open(STDOUT, ">&SAVEOUT");
open(STDIN, "<&SAVEIN");

exec("python-script") or die "exec failed: $!";
于 2012-11-20T19:37:44.163 回答