42

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

4

3 回答 3

67

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

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

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi
于 2008-10-15T17:47:03.303 回答
21

使用“测试”:

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

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

于 2008-10-15T17:38:46.190 回答
18

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

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(谢谢,史蒂夫。)

于 2008-10-15T17:43:41.360 回答