我有perl脚本,我已经为其创建了一个日志文件,此脚本将执行的所有操作都将写入日志文件中。
它工作正常,我做了一些修改来解决一些问题,但现在我遇到了一个奇怪的问题,文件处理程序在写日志文件时遇到困难,并且它没有更新日志文件,除非我是使用exit(x)选项退出脚本。
例如,我的脚本提供执行
备份
X。退出
现在我正在运行Extraction并正在更新日志。但是当extrcation完成后我打开了日志文件,我可以看到最后一行,如
Date: XYZ file extracted.
Date: XXXX file is preparing to extract
Date:
并没有进一步更新,虽然它已经提取了所有文件,然后我使用X选项退出脚本,只有在那之后我才能看到完整的日志。
我不明白为什么它会被卡住,所有其他选项也会发生这种情况。以前它工作正常。我只是使用文件处理程序和print来重定向它。
open FILE, ">>log.txt"
## DO some thing
print FILE $output;
有人可以告诉我可能是什么问题吗?
答案 0 :(得分:0)
您遇到了file buffering。这是大多数编程语言的正常做法。由于写入磁盘或终端的速度很慢,因此每个print语句不一定立即写入。输出通常存储在内存中(即“缓冲”),并在达到一定数量或特定字符时写入。
默认情况下,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);