【发布时间】:2015-06-11 02:03:54
【问题描述】:
我刚刚在 FreeBSD 9.3-RELEASE-p3 上遇到了 Perl 5.16.3 的一些奇怪行为。我们有一个每五分钟运行一次并生成一些文本状态文件的 cron 作业。我只是碰巧列出了输出目录的内容,并看到一些文件的时间戳是在未来!文件是这样创建的:
if (open(OUT, "> $status_file_path")) {
print OUT "$status_info\n";
close OUT;
}
现在,文件句柄 OUT 在多个地方使用,但是它在同一个块中打开和关闭,如上所示。就像我说的,在十个文件中,只有少数在使用 ls 显示时具有未来日期。
例如,当前日期的文件具有像 04/02/2015 20:29:46 这样的时间戳,具有 future 时间戳的文件在 11 月发布,例如11/10/2015 09:38:41.
这里可能发生了什么?
编辑
我正在运行两个测试:
1) 一个运行 1000 次迭代的循环的 perl 脚本,在迭代之间休眠长达 10 秒的随机时间,使用打开/打印/关闭逻辑创建输出文件,如果文件的修改时间在未来。
2) 每分钟访问一个测试文件的 cron 条目,例如触摸 /home/test/test_file_date_with_cron.txt
测试结果
这两个测试都没有生成带有未来时间戳的输出文件。
这太可怕了。
编辑 2
这是文件系统信息,文件写在/usr目录中。
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/gpt/gprootfs 2G 133M 1.7G 7% /
devfs 1.0k 1.0k 0B 100% /dev
/dev/gpt/gpusrfs 431G 3.8G 392G 1% /usr
procfs 4.0k 4.0k 0B 100% /proc
编辑 3
在 cron 之外运行脚本数百次迭代并没有重复问题。但是,我刚刚发现了一些其他文件,它们是由具有未来日期的 CGI 脚本创建的:
-rw-r--r-- 1 test test 5783 Nov 10 2015 Config.xml_20150210_104151
-rw-r--r-- 1 test test 34548 Nov 10 2015 Config2.xml_20150210_104151
-rw-r--r-- 1 test test 6105 Nov 10 2015 Config.xml_20151109_232210
-rw-r--r-- 1 test test 34554 Nov 10 2015 Config2.xml_20151109_232210
-rw-rw-r-- 1 root test 2075 Nov 9 2015 Config.xml_20151109_231055
-rw-rw-r-- 1 root test 1232 Nov 9 2015 Config2.xml_20151109_231055
这些是存档文件,使用文件的 mtime 时间戳移动和重命名。请注意,ls 和 Perl 的 stat() 函数都报告未来日期—— stat() 用于生成文件名称的时间戳部分。
查看第一个条目,ls 报告“Nov 10 2015”,而当 CGI 脚本处理它时,Perl 的 stat() 报告“20150210_104151”,即“Feb 02 2015”,这很可能是正确的。
再往下,我们看到 ls 显示“2015 年 11 月 10 日”,而 stat() 报告“20151109_232210”,即“2015 年 11 月 9 日”。
【问题讨论】:
-
您能否仅使用您在此处发布的代码重现此行为?
-
@ThisSuitIsBlackNot 我写了一个测试脚本循环写入文件,每次写入之间等待几秒钟,当然它没有重复问题。
-
@toolic 我编辑了我的帖子以显示未来的日期,即未来几个月的日期,因此这似乎不是时钟漂移问题。
-
这些文件是在共享文件系统(例如 NFS)上创建的吗?检查文件服务器上的时钟。
-
您说“a perl 脚本运行 1000 次迭代循环。”我在问你是否运行了在 cron 中表现出这种行为的 脚本。如果不是,那么您就是在比较苹果和橙子。