2008-10-15 27 views
34

Bir uyarı gönderiminde bulunmaya çalıştığım bir uyarı betiğidir, böylece bir uyarı gönderildiyse, son bir saat geçmesini istiyorum , başka bir uyarı göndermemek. Şimdi her dakika durumu kontrol eden bir cron görevim var çünkü durum karşılandığında hızlı bir şekilde uyarılmam gerekiyor ama konuyu kontrol altında tutana kadar her bir mahalleyi e-posta almam gerekmiyor. Bunu başarmak için bash'taki zamanı karşılaştırmanın en iyi yolu nedir?Bash'de Zaman Damgası Karşılaştırmasının Gerçekleştirilmesi İçin En İyi Yol nedir

cevap

60

en kolay mankenin modifikasyonu zamanları gibi zaman damgaları saklamaktır Dosyalar. GNU touch ve date komutları bu zamanları ayarlayabilir/alabilir ve tarih hesaplamaları yapabilir. Bash, bir dosyanın (-nt) 'dan daha yeni olup olmadığını (-ot) diğerinden daha yeni olup olmadığını kontrol etmek için testlere sahiptir. Geçen bildirim bir saat önce fazla oldu Örneğin

, sadece bir bildirim göndermek için:

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

Not: -nt, zaman damgaları arasında en az 1 saniyelik fark olmadıkça çalışmıyor. Bir dosyanın "yeni" olup olmadığını test etmek için "dokunduğum" bir geçici dosyayla karşılaştırdım. Bu -nt sorunu için orada bir "uyku 1" ekledi. Bu karşılaştırma aslında gitmek için en kolay yol gibi görünüyor, ancak uyku önerimi beğenmezseniz, ihtiyaçlarınıza bağlı olarak daha hassas bir tarih/zaman karşılaştırması isteyebilirsiniz. – BuvinJ

19

Kullanımı "test":

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

DÜZENLEME: Bir etkinlik, size daha sonra "test" kullanarak karşılaştırabilirsiniz bir dosya oluşturmak için "dokunma" kullanabilirsiniz meydana geldiği öğrenmek istiyorsanız.

+0

sayesinde, -Nt bit farkında değildi. Uyarı ilk kez tetiklendiğinde bir dosya oluşturabilir ve durum kurtarıldığında silinebilir (Bu durumda varoluşumu kontrol edebilirim). 'En azından bir saat sonra uyarıyı tekrar attıysam' nasıl uygulayabilirim? – Ichorus

+0

@Bruno'nun buna cevap verdiğini düşünüyorum. – JesperE

13

İki kez standart bir formata dönüştürmek ve bunları çıkarmak için tarih komutunu kullanın. Muhtemelen sonra bir şey gibi yapmak bir dotfile önceki yürütme zamanı saklamak istersiniz: (. Teşekkürler Steve)

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

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

echo "$curr" >/tmp/.lastrun 

farkla

+0

Neden çağlardan beri sadece saniye kullanmıyorsunuz (% s)? Bir saatte 3600 saniye. –

+0

Çünkü bu seçeneğin var olduğunu düşünmüş olsam da, ona bakmaya devam ettim ... –

+0

Bu yöntemi beğendim, daha yeni sürüm bash'a bağlı değil. Ve meşgul kutusu bunu yapabilirdi. –