【问题标题】:What is the Best Way to Perform Timestamp Comparison in Bash在 Bash 中执行时间戳比较的最佳方法是什么
【发布时间】:2008-10-15 17:34:39
【问题描述】:

我有一个警报脚本,我试图阻止向我发送垃圾邮件,因此我想设置一个条件,即如果在过去一小时内发送了警报,则不再发送另一个警报。现在我有一个每分钟检查一次条件的 cron 作业,因为我需要在满足条件时快速收到警报,但在问题得到控制之前,我不需要每分钟都收到电子邮件。在 bash 中比较时间以完成此任务的最佳方法是什么?

【问题讨论】:

    标签: bash time


    【解决方案1】:

    到目前为止,最简单的方法是将时间戳存储为虚拟文件的修改时间。 GNU touchdate 命令可以设置/获取这些时间并执行日期计算。 Bash 有测试来检查一个文件是比 (-nt) 新还是比另一个 (-ot) 旧。

    例如,仅在最后一次通知是一个多小时前才发送通知:

    touch -d '-1 hour' limit
    if [ limit -nt last_notification ]; then
        #send notification...
        touch last_notification
    fi
    

    【讨论】:

    • 注意:我发现 -nt 不起作用,除非时间戳之间至少有 1 秒的差异。为了测试一个文件是否是“新的”,我将它与我“接触”的临时文件进行了比较。我在那里添加了一个“sleep 1”来解决这个 -nt 问题。看起来这种比较实际上是最简单的方法,但如果您不喜欢我的睡眠建议,您可能需要更精确的日期/时间比较,具体取决于您的需要。
    • 请注意,-nt 是 POSIX 的扩展:pubs.opengroup.org/onlinepubs/009695399/utilities/test.html
    【解决方案2】:

    使用“测试”:

    if test file1 -nt file2; then
       # file1 is newer than file2
    fi
    

    编辑:如果您想知道事件何时发生,您可以使用“触摸”创建一个文件,以后可以使用“测试”进行比较。

    【讨论】:

    • 谢谢,我不知道 -nt 位。我可以在警报第一次触发时创建一个文件,并在条件恢复时将其删除(在这种情况下,我可以检查是否存在)。知道如何实现“如果至少一个小时后再次发出警报”位?
    • 我相信@Bruno 回答了这个问题。
    【解决方案3】:

    使用 date 命令将两个时间转换为标准格式,然后减去它们。您可能希望将以前的执行时间存储在一个点文件中,然后执行以下操作:

    last = cat /tmp/.lastrun
    curr = date '+%s'
    
    diff = $(($curr - $last))
    if [ $diff -gt 3600 ]; then
        # ...
    fi
    
    echo "$curr" >/tmp/.lastrun
    

    (谢谢,史蒂夫。)

    【讨论】:

    • 为什么不使用纪元以来的秒数 (%s)?一小时 3600 秒。
    • 我喜欢这种方法,它不依赖于较新版本的 bash。而busybox可以做到这一点。
    • 我认为你需要反引号或 $() 在你的通话日期。
    猜你喜欢
    • 2020-09-29
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多