如何用Daemon :: Simple保持打开STDOUT和STDERR

时间:2012-11-20 14:23:55

标签: perl exec fork

我一直在使用Daemon::Simple快速Daemonise一些脚本,并使它们启动/停止能力。但是,其中一些脚本是用python编写的,所以我通常会调用Daemon::Simple::Init()然后调用exec() python脚本。

但是,我发现Daemon::Simple::Init()关闭了STDOUTSTDERR,结果似乎是python脚本在写入{{{ 1}}和STDOUT。重新打开STDERRSTDOUT并在exec之前将它们重定向到文件无效。

我发现的确有助于改变STDERR的来源:

Daemon::Simple

为:

close(STDOUT);
close(STDERR);

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

无论如何我可以重新开启或保持开放/dev/nullSTDOUT而无需修改STDERR生存的Daemon::Simple吗?

2 个答案:

答案 0 :(得分:3)

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

open STDOUT, '>', '/dev/null';

答案 1 :(得分: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: $!";