perl - 如何重新初始化 Perl 的 STDIN/STDOUT/STDERR?

标签 perl redirect stdout stdin stderr

我有一个 Perl 脚本,它自己 fork 和守护进程。它由 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" 放在一起的技巧。 ,但是仅仅制作这个副本的行为并不能解决留下僵尸的原始问题。

我正在寻找是否有像 open STDOUT,"|-" 这样的魔法(我知道不是这样)以应该打开的方式打开 STDOUT。

最佳答案

# 文件描述符的副本

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: $!";

#我希望这对你有用。

#-哈里帕萨德 AJ

关于perl - 如何重新初始化 Perl 的 STDIN/STDOUT/STDERR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1348639/

相关文章:

perl - 从 'use fields' 杂注返回字段列表?

apache - 使用 htaccess 屏蔽 301 重定向的 URL

javascript - Node.js child_process exec 的标准输出被缩短

python - 将标准输出从 subprocess.Popen 保存到文件,并将更多内容写入文件

正则表达式逻辑比较简化

perl - 为什么打印 $( 会给出一个数字系列

linux - 在 linux ubuntu 中使用 CPAN 时,我应该使用 sudo/作为 root 还是作为我的默认用户运行它

html - 使用不同的 URL 加载同一页面?

javascript - 如何将根页面重定向到angularjs中的另一个url

bash - 如何使用 Bash 将标准输出和标准错误重定向并 append 到文件