【发布时间】:2008-10-15 17:34:39
【问题描述】:
我有一个警报脚本,我试图阻止向我发送垃圾邮件,因此我想设置一个条件,即如果在过去一小时内发送了警报,则不再发送另一个警报。现在我有一个每分钟检查一次条件的 cron 作业,因为我需要在满足条件时快速收到警报,但在问题得到控制之前,我不需要每分钟都收到电子邮件。在 bash 中比较时间以完成此任务的最佳方法是什么?
【问题讨论】:
我有一个警报脚本,我试图阻止向我发送垃圾邮件,因此我想设置一个条件,即如果在过去一小时内发送了警报,则不再发送另一个警报。现在我有一个每分钟检查一次条件的 cron 作业,因为我需要在满足条件时快速收到警报,但在问题得到控制之前,我不需要每分钟都收到电子邮件。在 bash 中比较时间以完成此任务的最佳方法是什么?
【问题讨论】:
到目前为止,最简单的方法是将时间戳存储为虚拟文件的修改时间。 GNU touch 和 date 命令可以设置/获取这些时间并执行日期计算。 Bash 有测试来检查一个文件是比 (-nt) 新还是比另一个 (-ot) 旧。
例如,仅在最后一次通知是一个多小时前才发送通知:
touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
#send notification...
touch last_notification
fi
【讨论】:
-nt 是 POSIX 的扩展:pubs.opengroup.org/onlinepubs/009695399/utilities/test.html
使用“测试”:
if test file1 -nt file2; then
# file1 is newer than file2
fi
编辑:如果您想知道事件何时发生,您可以使用“触摸”创建一个文件,以后可以使用“测试”进行比较。
【讨论】:
使用 date 命令将两个时间转换为标准格式,然后减去它们。您可能希望将以前的执行时间存储在一个点文件中,然后执行以下操作:
last = cat /tmp/.lastrun
curr = date '+%s'
diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
# ...
fi
echo "$curr" >/tmp/.lastrun
(谢谢,史蒂夫。)
【讨论】:
$() 在你的通话日期。