小编bac*_*ver的帖子

STDOUT 和 STDERR 乱序

我有一个 perl 脚本,它将消息写入 STDOUT 和 STDERR(通过打印/croak 语句),但我也将 STDOUT 和 STDERR 重定向到日志文件:

File::Tee::tee STDOUT, ">>", "$logFile" ;
File::Tee::tee STDERR, ">>", "$logFile" ;
Run Code Online (Sandbox Code Playgroud)

现在输出日志文件有来自 STDOUT 和 STDERR 的消息显示乱序。此外,终端上的实际输出也出现故障。我试过刷新缓冲区(如这里推荐的那样:https : //perl.plover.com/FAQs/Buffering.html)但它没有帮助:

select(STDERR) ;
$| = 1 ;
select(STDOUT) ;
$| = 1 ;
Run Code Online (Sandbox Code Playgroud)

有谁知道我必须做什么才能按顺序查看输出(我还尝试另外刷新与 $logfile 对应的文件句柄,但它仍然相同)?


编辑:

感谢所有回复的人。关于这个问题的很多讨论都以评论结束,所以我将根据大家的反馈列出我尝试过的一些事情。

  1. 在使用 File::Tee 之前,我已经在刷新 STDOUT 和 STDERR。正如@jimtut 怀疑的那样,File::Tee 确实是罪魁祸首——删除它可以恢复控制台上的排序。但我确实想重定向 STDOUT 和 STDERR。
  2. @mob 建议改用 IO::Tee,但我还没有完全理解如何在我的代码中按照我想要的方式进行工作。
  3. @briandfoy 指出没有一种可靠的方法可以确保实时以正确的顺序看到 2 个单独的文件句柄,并且还建议使用日志记录程序,这是唯一可以写入 STDOUT/STDERR 的地方。@zimd 进一步指出 File::Tee 使用 fork 这是问题的核心,因为 2 个进程不能保证输出的任何顺序。
  4. 由于 File::Tee 是罪魁祸首,我试图从代码中删除它。我更新了我的记录器功能以打印到 STDOUT/STDERR 以及另外打印到 $log …

io perl buffering

3
推荐指数
1
解决办法
1050
查看次数

标签 统计

buffering ×1

io ×1

perl ×1