【问题标题】:Perl created files with future timestamps on FreeBSD 9.3Perl 在 FreeBSD 9.3 上创建带有未来时间戳的文件
【发布时间】: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 中表现出这种行为的 脚本。如果不是,那么您就是在比较苹果和橙子。

标签: perl file-io freebsd


【解决方案1】:

找到那些额外的存档配置文件帮助我找到了原因,正如其他人所建议的那样,系统日期和时区发生了变化。

From:  1447147328 and America/Adak
To:    1426637771 and America/New_York

让我失望的是,我认为 cron 脚本每次执行时都会写入所有输出文件,但事实并非如此。这些文件有不同的“刷新间隔”。

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2015-08-25
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2021-04-29
    • 2015-12-14
    相关资源
    最近更新 更多