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
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
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”.
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
Wierzę, że @Bruno na to odpowiedział. – JesperE
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
Dlaczego po prostu nie używać sekund od epoki (% s)? 3600 sekund na godzinę. –
Ponieważ chociaż wydawało mi się, że taka opcja istniała, to ciągle ją oglądałem ... –
Podoba mi się ta metoda, nie zależy ona od nowszej wersji bash. A zajęty mógłby to zrobić. –
- 1. Jaki jest najlepszy sposób na porównywanie programów w systemie Windows?
- 2. Porównywanie daty JavaScript ignorowanie wartości datownika
- 3. Jaki jest najlepszy sposób na seed srand()?
- 4. Jaki jest najlepszy sposób na wdrożenie "timera"?
- 5. Jaki jest najlepszy sposób na naukę CUDA?
- 6. Jaki jest najlepszy sposób na skopiowanie listy?
- 7. Jaki jest najlepszy sposób na naukę Erlanga?
- 8. Jaki jest najlepszy sposób na obsługę I18N w tabelach odnośników?
- 9. Jaki jest najlepszy sposób na ukrycie zakładki w TabNavigator?
- 10. Jaki jest najlepszy sposób na wyczyszczenie ekranu w Perlu?
- 11. Jaki jest najlepszy sposób na analizowanie strony internetowej w Ruby?
- 12. Jaki jest najlepszy sposób na usunięcie elementu tablicy w PHP?
- 13. Jaki jest najlepszy sposób na tworzenie Java w Emacs?
- 14. Jaki jest najlepszy sposób na duplikowanie danych w szablonie django?
- 15. Jaki jest najlepszy sposób na oczyszczenie obiektu w Javie?
- 16. Jaki jest najlepszy sposób na obsługę zdarzeń w Ember.js?
- 17. Jaki jest najlepszy sposób na uzyskanie liczb losowych w NumPy?
- 18. Jaki jest najlepszy sposób na obsługę wiadomości FBO w OpenGL?
- 19. Jaki jest najlepszy sposób na zastąpienie pliku remote.origin.url w Git?
- 20. Jaki jest najlepszy sposób na matematykę z CGFloats w szybkim?
- 21. Jaki jest najlepszy sposób na zastąpienie operatora trójskładnikowego w Pythonie?
- 22. Jaki jest najlepszy sposób na zarządzanie fragmentami kodu w Xcode?
- 23. Jaki jest najlepszy sposób na wysłanie QStrings w wywołaniu funkcji?
- 24. Jaki jest najlepszy sposób na przetasowanie tablicy w Perlu?
- 25. Jaki jest najlepszy sposób na stopienie listy w wektorze?
- 26. jaki jest najlepszy sposób na parsowanie odpowiedzi xml w AJAX
- 27. Jaki jest najlepszy sposób na robienie czegoś okresowo w Erlang?
- 28. Jaki jest najlepszy sposób na wymuszenie scalenia w git?
- 29. Jaki jest najlepszy sposób na uniknięcie wyjątku NoSuchElementException w Selenie?
- 30. Jaki jest najlepszy sposób zamknięcia gałęzi Mercurial?
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