Was ist der beste Weg, Timestamp-Vergleich in Bash to Perform
Frage
Ich habe eine Warnung Skript, das ich von Spamming mich zu halten versuche, so würde Ich mag einen Zustand versetzen, dass, wenn ein Alarm innerhalb der letzten Stunde sagen gesendet wurde, nicht einen weiteren Alarm zu senden. Jetzt habe ich einen cron-Job, den die Bedingung jede Minute überprüft, weil ich schnell alarmiert werden müssen, wenn die Bedingung erfüllt ist, aber ich brauche nicht die E-Mail jeden munite zu bekommen, bis ich das Problem unter Kontrolle zu bekommen. Was ist der beste Weg, um Zeit in bash vergleichen dies zu erreichen?
Lösung
Bei weitem ist die einfachste Zeitstempel als Änderungszeiten von Dummy-Dateien zu speichern. GNU touch
und date
Befehle können diese Zeiten einstellen / bekommen und Datumsberechnungen durchzuführen. Bash hat Tests zu überprüfen, ob eine Datei neuer ist als (-nt
) oder älter als (-ot
) eine andere.
Zum Beispiel, um nur eine Benachrichtigung zu senden, wenn die letzte Meldung ist mehr als eine Stunde vor:
touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
#send notification...
touch last_notification
fi
Andere Tipps
Verwenden Sie "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 mit „test“
Mit dem Befehl date, die zwei Mal in ein Standardformat konvertieren, und sie subtrahiert. Sie wollen wahrscheinlich die vorherige Ausführungszeit in einem dotfile speichern dann so etwas wie:
last = cat /tmp/.lastrun
curr = date '+%s'
diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
# ...
fi
echo "$curr" >/tmp/.lastrun
(Danke, Steve.)