我有一个Perl脚本,它自己派生和守护进程。它是由cron运行的,所以为了不留下僵尸,我关闭了STDIN、STDOUT和STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
我的问题是:我希望在这一点之后至少恢复STDOUT (恢复另外2个会很好)。但是,我需要使用什么魔法符号来重新打开STDOUT,就像以前的STDOUT一样?
我知道如果我是从tty运行的,我可以使用"/dev/tty“(但我是从cron运行的,并且在其他地方依赖于stdout )。我也读过一些技巧,你可以用open SAVEOUT,">&STDOUT"
把STDOUT放在一边,但是仅仅复制这个副本并不能解决留下僵尸的原始问题。
我想看看是否有像open STDOUT,"|-"
一样的魔力(我知道不是这样),可以按照应该打开的方式打开STDOUT。
发布于 2009-11-12 15:49:51
文件描述符的副本
open(CPERR, ">&STDERR");
将stderr重定向到警告文件
open(STDERR, ">>xyz.log") || die "Error stderr: $!";
关闭重定向的文件句柄
close(STDERR) || die "Can't close STDERR: $!";
恢复stdout和stderr
open(STDERR, ">&CPERR") || die "Can't restore stderr: $!";
#我希望这对你有用。
#-Hariprasad AJ
发布于 2009-08-28 19:43:01
一旦关闭,就再也找不回来了。
为什么你又需要STDOUT了?将消息写入控制台?使用/dev/console,或者使用Sys::Syslog写入syslog。
不过老实说,另一个答案是正确的。如果您想要稍后重新打开旧的标准输出(克隆到新的fd),则必须将其保存。它确实解决了“僵尸”问题,因为您可以将fd0(和1& 2)重定向到/dev/null。
https://stackoverflow.com/questions/1348639
复制相似问题