2011-01-11 21 views
8

i grep ile kuyruk günlük dosyasına istiyor ve bunun gibi posta yoluyla gönderilen:kuyruğu ve grep günlüğü ve posta (linux)

tail -f /var/log/foo.log | grep error | mail -s subject [email protected] 

ben bu nasıl yapabilirim?

+0

Bu soru "Yazdırdım" ('Foo'); 've' Foo 'yazdırmasını istiyorum. Bunu nasıl yapabilirim?' Tam olarak nedir * sorusu nedir? –

+1

Muhtemelen 'tail' * -f * istemezsiniz, çünkü bu dosyanın altını sürekli olarak takip eder. "grep" de ** kuyruk ** günlükleri değil. Çözmeye çalıştığın problem nedir? – Johnsyweb

+0

' kuyruk -f .. | grep ... 'dosya büyürken ve grep kullanımıyla eklenmiş veriyi çıkarır, sadece sadece – ajreal

cevap

2

Bu konuda bir adım atacağım. Belki de icky bash kodunun dikkatini çektiyse bir şeyler öğrenirim. Bunu yapmak için şimdiden bir gazilyon çözümü var, ama ben, cyberocean'ın derinliklerini ve genişliklerini trollediğinizden emin olduğumdan, bunu öğrenemeyeceğim. İstediğiniz gibi iki bit olarak ayrılabilir: 1) düzenli aralıklarla, dosyanın son kuyruğunu edinin, 2) son kuyruk gerçekte varsa, e-posta ile gönderin. 1) düzenli aralıklarla, cron kullanın. 2) son kuyruğu elde etmek için, dosya boyutunu takip etmelisiniz. Aşağıdaki bash betiği bunu yapar - cron tarafından çalıştırılabilen 2'ye bir çözümdür. Postaya ihtiyacı olan dosyanın yığınını hesaplamak için önbelleğe alınmış dosya boyutunu kullanır. Bir dosya için dosyam .ofset.myfile başka bir dosya oluşturulduğunu unutmayın. Ayrıca, betik dosya adındaki yol bileşenlerine izin vermiyor. Yeniden yaz veya çağırmaya yerleştir [ör. (cd/foo/bar & & segtail.sh zut), buna segtail.sh] denir.

#!/usr/local/bin/bash 
file=$1 
size=0 
offset=0 
if [[ $file =~/]]; then 
    echo "$0 does not accept path components in the file name" 2>&1 
    exit 1 
fi 
if [[ -e .offset.$file ]]; then 
    offset=$(<".offset.$file") 
    fi 
if [[ -e $file ]]; then 
    size=$(stat -c "%s" "$file") # this assumes GNU stat, possibly present as gstat. CHECK! 
            # (gstat can also be Ganglias Status tool - careful). 
fi 
if (($size < $offset)); then  # file might have been reduced in size 
    echo "reset offset to zero" 2>&1 
    offset=0 
fi 
echo $size > ".offset.$file" 
if [[ -e $file && $size -gt $offset ]]; then 
    tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" [email protected] 
fi 
+0

Sorunuzun grep kısmı bu soruya cevap vermedi. Egzersiz olarak kaldı. – micans

+0

Dosya adı değişken genişletmeleri etrafındaki tüm tekliflere ihtiyacınız var. Tüm sistemler için bash yolu doğru değil; belki "env" ile çağırır. 'Stat'ün çıktısı, sistemler ve sürümler arasında oldukça değişkendir (!). Son GNU statüsünü varsayarak, bunu çözmek için -c'yi ve ayrıştırma ihtiyacından kaçınmayı deneyin. – Sorpigal

+0

Hayır 'cat' gerekli:' offset = $ (<. Offset. $ Dosya) '. Eğer [[-e $ file && $ size> $ offset]] 'kelimesinin ikinci kısmı bir sözlüksel karşılaştırma ise, örneğin '$ size' == 10 ve' $ offset ise beklediğinizi yapmayacaktır. '== 2. Bunu yerine kullanın:' [[-e $ file]] ise && (($ size> $ offset)) '. Dolar işaretlerini çoğu durumda '(())' ve '$ (())' içinde bırakabilirsiniz. –

17

E-posta ile ilgili hatalar meydana geldiğinde e-posta göndermek mi istiyorsunuz? grep çıktı her satır için bir e-posta gönderir

tail -f $log | 
grep --line-buffered error | 
while read line 
do 
    echo "$line" | mail -s subject "$email" 
done 

: Bununla birlikte böyle bir şey deneyebilirsiniz

); O başarısız olabilir.

nohup ./monitor.sh & 

ile kabuk komut dosyası üzerinde

çalıştırın böylece arka planda çalışmaya devam eder.

+1

izleyen ters eğik çizgi gerekmez - Kabuk takip eden bir boru (ve ayrıca '&', '&& ve' || ') –

+0

için bir sonraki hatta bakacağım ilginç ... bir şey özledim. Teşekkürler @glenn jackman –

+1

Hatadan sonra 10 satırı yazdırmak istediğimi varsayalım (grep-A 10 hatası). Yaklaşımınızda 10 e-posta alacağım, 10 satırı içeren sadece bir posta almak için ne yapmam gerekiyor? – markus