我一直在使用Daemon::Simple
快速Daemonise一些脚本,并使它们启动/停止能力。但是,其中一些脚本是用python编写的,所以我通常会调用Daemon::Simple::Init()
然后调用exec()
python脚本。
但是,我发现Daemon::Simple::Init()
关闭了STDOUT
和STDERR
,结果似乎是python脚本在写入{{{ 1}}和STDOUT
。重新打开STDERR
和STDOUT
并在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/null
和STDOUT
而无需修改STDERR
生存的Daemon::Simple
吗?
答案 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: $!";