我怎样才能重新初始化Perl的标准输入/输出/ STDERR?(How can I reinitia

2019-07-04 00:33发布

我有一个Perl脚本,叉子和daemonizes本身。 它是由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什么用呢?

我知道,我可以使用“的/ dev / tty的”如果我是从一个tty运行(但我从cron运行,并根据标准输出其他地方)。 我也看到了窍门,你可以把STDOUT一边与open SAVEOUT,">&STDOUT" ,但使这个副本不解决周围留下一个僵尸原来只是问题的行为。

我想看看是否有像一些魔法open STDOUT,"|-" (我知道是不是),打开STDOUT它应该是开辟了道路。

Answer 1:

如果它仍然是有用的,两件事情浮现在脑海中:

  1. 您可以在短短的子进程关闭STDOUT / STDERR / STDIN(即如果(!fork()的)。这将允许父母仍然使用他们,因为他们仍然会在那里开。

  2. 我想你可以使用更简单的关闭(标准输出),而不是它开到/ dev / null的。

例如:

if (!fork()) {
    close(STDIN) or die "Can't close STDIN: $!\n";
    close(STDOUT) or die "Can't close STDOUT: $!\n";
    close(STDERR) or die "Can't close STDERR: $!\n";
    do_some_fork_stuff();
}


Answer 2:

文件描述符#副本

open(CPERR, ">&STDERR");

#重定向标准错误中警告文件

open(STDERR, ">>xyz.log") || die "Error stderr: $!";

#关闭文件句柄重定向

close(STDERR) || die "Can't close STDERR: $!";

#恢复输出和错误

open(STDERR, ">&CPERR") || die "Can't restore stderr: $!";

#我希望这对你的作品。

#-Hariprasad AJ



Answer 3:

一旦关闭,有没有办法把它找回来。

为什么你需要再次STDOUT? 要写入信息到控制台? 使用/ dev / console的为,或写Sys系统::系统日志到syslog。

老实说,虽然,对方的回答是正确的。 你必须保存旧的标准输出,如果你想在以后重新打开它(克隆到一个新的FD)。 它确实解决了“僵尸”的问题,因为你可以然后重定向FD 0(和1&2)到/ dev / null的。



文章来源: How can I reinitialize Perl's STDIN/STDOUT/STDERR?