2008-10-15 73 views
34

我有一個提醒腳本,我試圖阻止垃圾郵件發送給我,所以我想提出一個條件,如果警報已發送,比如說最後一個小時,不發送另一個警報。現在我有一項cron工作,每分鐘檢查一次情況,因爲我需要在滿足條件時迅速收到警報,但是我不需要每隔一段時間都收到電子郵件,直到問題得到控制。在bash中比較時間的最佳方法是什麼?什麼是在Bash中執行時間戳比較的最佳方式

回答

60

目前最簡單的是存儲時間戳作爲虛擬的修改時間文件。 GNU touchdate命令可以設置/獲取這些時間並執行日期計算。 Bash有測試來檢查一個文件是否比(-nt)更新或者比(-ot)更新。

例如,只發送一個通知,如果最後的通知是一個多小時前更多:

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

使用「測試」:

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

編輯:如果你想知道當一個事件發生時,您可以使用「觸摸」創建一個文件,你可以在以後比較使用「測試」。

+0

謝謝,我不知道該-nt位。當警報第一次觸發時,我可以創建一個文件,並在條件恢復時刪除它(在這種情況下,我可以檢查是否存在)。任何想法我怎麼能實現'如果它已經至少一個小時再次拋出警報'位? – Ichorus 2008-10-15 17:46:58

+0

我相信@布魯諾回答說。 – JesperE 2008-10-16 08:36:58

13

使用date命令將兩次轉換爲標準格式,並將它們相減。你可能會想以前的執行時間儲存在dotfile那麼這樣做:(謝謝你,史蒂夫)

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

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

echo "$curr" >/tmp/.lastrun 

+0

爲什麼不使用自紀元(%s)以來的秒數?一小時3600秒。 – 2008-10-15 17:53:04

相關問題