2008-10-15 18 views
34

Mam skrypt alertu, który próbuję powstrzymać przed spamowaniem, więc chciałbym umieścić warunek, że jeśli alert został wysłany w ciągu, powiedzmy, ostatniej godziny , aby nie wysyłać kolejnego alertu. Teraz mam zadanie cron, które sprawdza stan co minutę, ponieważ muszę być szybko powiadomiony, gdy warunek zostanie spełniony, ale nie muszę otrzymywać wiadomości e-mail co munite, dopóki problem nie zostanie opanowany. Jaki jest najlepszy sposób na porównanie czasu w bashu, aby to osiągnąć?Jaki jest najlepszy sposób na porównywanie datownika w Bash?

Odpowiedz

60

Zdecydowanie najłatwiej jest przechowywanie znaczniki czasu jako czas modyfikacji manekina akta. Polecenia GNU touch i date mogą ustawić/uzyskać te czasy i wykonać obliczenia daty. Bash ma testy, aby sprawdzić, czy plik jest nowszy niż (-nt) lub starszy niż (-ot) inny.

Na przykład, aby tylko wysłać powiadomienie jeżeli ostatnia notyfikacja była więcej niż godzinę temu:

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

Uwaga: Znalazłem -nt nie działa, chyba że istnieje co najmniej 1 sekunda różnicy między znacznikami czasu. Aby sprawdzić, czy plik jest "nowy", porównałem go z plikiem tymczasowym, który "dotknąłem". Dodałem "spać 1", aby uwzględnić ten -nt problem. Wygląda na to, że porównanie to jest w rzeczywistości najłatwiejsze, ale jeśli nie podoba ci się moja sugestia snu, możesz chcieć dokładniejszego porównania daty/czasu w zależności od Twoich potrzeb. – BuvinJ

19

Use „test”:

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

EDIT: Jeśli chcesz wiedzieć, kiedy zdarzenie miało miejsce, można użyć „dotyk”, aby utworzyć plik, który później można porównać stosując „test”.

+0

Dzięki, że nie był świadomy -NT bit. Mogłem utworzyć plik po pierwszym wyzwoleniu alarmu i usunąć go, gdy stan się poprawi (w takim przypadku mógłbym tylko sprawdzić istnienie). Każdy pomysł, w jaki sposób mogę zaimplementować "jeśli minęła co najmniej godzina, ponownie wygeneruje alert"? – Ichorus

+0

Wierzę, że @Bruno na to odpowiedział. – JesperE

13

Użyj polecenia data, aby przekonwertować dwa razy na standardowy format i odjąć je. Prawdopodobnie będziesz chciał przechowywać poprzedni czas wykonania w dotfile następnie zrobić coś takiego: (. Dzięki, Steve)

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

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

echo "$curr" >/tmp/.lastrun 

+0

Dlaczego po prostu nie używać sekund od epoki (% s)? 3600 sekund na godzinę. –

+0

Ponieważ chociaż wydawało mi się, że taka opcja istniała, to ciągle ją oglądałem ... –

+0

Podoba mi się ta metoda, nie zależy ona od nowszej wersji bash. A zajęty mógłby to zrobić. –

Powiązane problemy