我刚刚在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秒,使用open / print / close逻辑创建输出文件,如果文件的修改时间在,则中止脚本未来。
2)每分钟触摸一次测试文件的cron条目,例如 touch /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时间戳进行移动和重命名。请注意,BOTH ls 和Perl的 stat()函数报告未来日期 - stat()用于生成名称的文件时间戳部分。
查看第一个条目,ls报告“2015年11月10日”,而当CGI脚本处理它时,Perl的stat()报告“20150210_104151”,即“2015年2月2日”,这很可能是正确的。
再往下,我们看到ls显示“2015年11月10日”,stat()报告“20151109_232210”,即“2015年11月9日”。
答案 0 :(得分:0)
查找这些额外的归档配置文件有助于我找出原因,正如其他人所建议的那样,系统日期和时区发生了变化。
From: 1447147328 and America/Adak
To: 1426637771 and America/New_York
什么让我失望,是因为我认为cron脚本每次执行时都会写出所有输出文件,但情况并非如此。这些文件具有不同的刷新间隔"。