2008-10-15 16 views
34

Ich habe ein Alert-Skript, dass ich versuche, mich zu spammen, also möchte ich eine Bedingung setzen, dass, wenn eine Warnung innerhalb gesendet wurde, sage die letzte Stunde , um keinen weiteren Alarm zu senden. Jetzt habe ich einen Cron-Job, der den Zustand jede Minute überprüft, weil ich schnell benachrichtigt werden muss, wenn die Bedingung erfüllt ist, aber ich muss die E-Mail nicht jede Minute abrufen, bis ich das Problem unter Kontrolle habe. Was ist der beste Weg, Zeit in bash zu vergleichen, um dies zu erreichen?Was ist der beste Weg zur Zeitstempelvergleich in Bash

Antwort

60

Bei weitem ist die einfachste Zeitstempel als Änderungszeiten von Dummy zu speichern Dateien. GNU touch und date Befehle können diese Zeiten setzen/abrufen und Datumsberechnungen durchführen. Bash hat Tests, um zu überprüfen, ob eine Datei neuer als (-nt) oder älter als (-ot) eine andere Datei ist.

Zum Beispiel sendet nur eine Benachrichtigung, wenn die letzte Meldung war mehr als eine Stunde vor:

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

Hinweis: Ich fand -nt nicht funktioniert, es sei denn, es gibt mindestens 1 Sekunde Unterschied zwischen den Zeitstempeln. Um zu testen, ob eine Datei "neu" war, habe ich sie mit einer temporären Datei verglichen, die ich "berührt" habe. Ich habe einen "Schlaf 1" hinzugefügt, um dieses Problem zu beheben. Es scheint, dass dieser Vergleich tatsächlich der einfachste Weg ist, aber wenn Sie meinen Schlafvorschlag nicht mögen, möchten Sie vielleicht einen genaueren Datum/Zeit-Vergleich, je nach Ihren Bedürfnissen. – BuvinJ

19

Use „test“:

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

EDIT: Wenn Sie wissen möchten, wann ein Ereignis aufgetreten ist, können Sie „touch“ verwenden, um eine Datei zu erstellen, die Sie später vergleichen können „test“ verwenden.

+0

Danke, ich war der -nt Bit nicht bewusst. Ich könnte eine Datei erstellen, wenn die Warnung zuerst ausgelöst wird, und sie löschen, wenn die Bedingung wiederhergestellt wird (in diesem Fall könnte ich einfach nach Existenz suchen). Irgendeine Idee, wie ich das 'wenn es mindestens eine Stunde war, die Alarmstufe erneut auslösen' umsetzen könnte? – Ichorus

+0

Ich glaube @Bruno hat das beantwortet. – JesperE

13

Verwenden Sie den Befehl date, um die zwei Zeiten in ein Standardformat zu konvertieren und subtrahieren Sie sie. Sie wollen wahrscheinlich die vorherige Ausführungszeit in einem dotfile speichern dann so etwas wie: (. Danke, Steve)

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

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

echo "$curr" >/tmp/.lastrun 

+0

Warum nicht nur Sekunden seit der Epoche (% s) verwenden? 3600 Sekunden in einer Stunde. –

+0

Weil, obwohl ich dachte, dass diese Option existierte, habe ich es immer wieder übersehen ... –

+0

Ich mag diese Methode, es ist nicht von neueren Version Bash abhängig. Und busybox könnte das tun. –

Verwandte Themen