文件处理程序在将输出写入 Perl 中的文本文件时卡住

file handler getting stuck while wrting output to a text file in Perl

我有 perl 脚本,我为其创建了一个日志文件,该脚本将执行的所有操作都将写入日志文件。

它工作正常,我做了一些更改来解决一些问题,但现在我遇到了一个奇怪的问题,文件处理程序在写入日志文件期间卡住了,并且它不会更新日志文件,直到并且除非我正在使用退出 (x) 选项退出脚本。

例如,我的脚本提供执行

  1. 提取

  2. 验证

  3. 备份

    X。退出

现在我是 运行 Extraction 并且正在更新日志。但是当提取完成时,我打开了日志文件,我可以看到最后一行

Date: XYZ file extracted.    
Date: XXXX file is preparing to extract
Date:

虽然它已经提取了所有文件,但也没有进一步更新,然后我使用 X 选项退出脚本,只有在那之后我才能看到完整的日志。

我不明白为什么它会卡住,所有其他选项也会出现这种情况。以前它工作正常。我只是使用文件处理程序并打印来重定向它。

open FILE, ">>log.txt" 
    
## DO some thing

print FILE $output;

谁能告诉我可能是什么问题?

您正在遇到 file buffering。这是大多数编程语言所做的正常事情。因为写入磁盘或终端很慢,每个打印语句不一定立即写入。输出通常存储在内存中(即 "buffered"),并在达到一定数量或特定字符时写入。

默认情况下,STDERR 没有缓冲。 STDOUT 到终端通常是行缓冲的,这意味着它会在看到换行符时写入。文件以块为单位进行缓冲,通常为 4K 或 8K,具体取决于您的系统。

对于日志文件,关闭此缓冲是有意义的。所有文件句柄都响应 IO::Handle 方法,因此请使用 IO::Handle 方法 autoflush 来执行此操作。

# Because you've forgotten to check if the file opened.
use autodie;

open my $fh, ">>", $log_file;
$fh->autoflush(1);