【问题标题】:Will using ntpd possibly mess up cron jobs?使用 ntpd 可能会搞砸 cron 作业吗?
【发布时间】:2011-12-31 04:37:06
【问题描述】:

我的系统有很多时间漂移,几周后它可能会提前大约 5 分钟。

为了解决这个问题,我安装了 ntp,它可以帮助修复漂移,当然也可以偶尔将时间同步到 ntp 服务器。

假设我有一个 cron 作业,比如备份文件。下面的情况可能吗?

02:00:00 - Cron starts a job
02:00:03 - Ntpd syncs time back 5 seconds to 01:59:58
02:00:00 - 2:00 gets repeated and cron job runs twice

如果 cron 作业复制大文件,第二次运行可能会尝试覆盖第一个作业未完成写入的文件。

谢谢!

【问题讨论】:

    标签: unix cron ntp


    【解决方案1】:

    这是cron(8) 手册页所说的(这是针对 Vixie cron 的;其他实现可能会有不同的行为):

    时钟变化小于 3 时存在特殊注意事项 小时,例如在夏令时开始和结束时 时间。如果时间向前推进,那些本来可以运行的工作 在被跳过的时间将在更改后不久运行。 相反,如果时间倒退了不到 3 小时, 那些属于重复时间的作业将不会重新运行。

    仅在特定时间运行的作业(未指定为 @hourly,也未指定为 在小时或分钟说明符中带有“*”)会受到影响。工作 使用通配符指定的基于新时间运行 马上。

    超过 3 小时的时钟更改被视为更正 时钟,并立即使用新时间。

    【讨论】:

    • 所以,答案是“是的,你的情况会发生”,对吧?
    • @BenjaminW。我的阅读是 OP 的情况可能会或可能不会发生。如果 cron 作业明确指定 2:00:00,则如果 ntpd 将时钟设置回 5 秒,则该作业不会重复。但是如果作业指定了通配符(比如每小时运行一次),那么它将被重复。但我只是在解释 Keith 引用的文档。
    【解决方案2】:

    在这种特殊情况下可能会,但我建议您在备份作业中设置一个锁定机制,它只允许它运行一次:

    在 PERL 中,您可以执行以下操作:

    flock("/tmp/backup-running", LOCK_EX) || die "I'm already running";
    

    虽然 shell 可能不会为您提供类似的机制,除非通过运行:

    touch /tmp/backup-running
    if [ -f "/tmp/backup-running" ]
    then
        exit 0;
    fi
    
    ....
    
    
    /bin/rm /tmp/backup-running
    

    这很容易出现问题,其他语言为您提供与 PERL 类似的功能。

    【讨论】:

      【解决方案3】:

      ntp.conf 允许您控制 ntp 连接到时间服务器以进行更正的频率。默认最小值为 64 秒 (minpoll),maxpoll 的默认值为 1024 秒。见 man ntp.conf

      因此,如果你在不影响事情的时候手动校正时间,然后启动ntp,漂移量会很小,非常亚秒级的变化。

      我们的一个 m4000 有这样的时钟,我们从来没有遇到过问题。

      注意:锁定文件的唯一问题是,如果备份严重异常终止,则在重置锁定文件之前不会运行更多备份。

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 2018-05-21
        • 2013-03-18
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        • 2010-10-25
        相关资源
        最近更新 更多