Ssh üzerinden birden fazla makinede kuyruk günlük dosyası


36

tailBirden fazla uzak makinede bir günlük dosyasına çalışıyorum ve çıktıyı yerel iş istasyonuma iletiyorum. Ctrl- tuşuna basıldığında bağlantıların kapanmasını istiyorum C.

Şu anda neredeyse amaçlandığı gibi çalışan aşağıdaki fonksiyona sahibim .

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}

Bağlantılar kapanıyor ve çıkışını alıyorum tail. AMA, çıkış bir dizi geldiği için bir tür tamponlama oluyor.

Ve işte eğlenceli kısım…

Aşağıdakini çalıştırırken aynı tamponlama davranışını görebiliyorum ve /var/log/server.loguzak makinelerde 4-5 kez dosyaya "test" ekliyorum…

ssh server-01 "tail -f /var/log/server.log | grep test"

… Ve onu devre dışı bırakmanın iki yolunu bulmuş…

  1. Ssh'e -t bayrağı ekle.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. Uzak komuttan teklifi kaldırın.

    ssh server-01 tail -f /var/log/server.log | grep test

Ancak, bu yaklaşımların hiçbiri yukarıda belirtilen birden fazla makinede yürütülen işlev için çalışmaz.

Çalıştırırken aynı tamponlama davranışına sahip olan dsh'yi denedim.

dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"

Burada, alıntıyı kaldırırsam, tamponlama gider ve her şey iyi çalışır.

dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test

Ayrıca çalıştı parallel-sshtam olarak aynı şekilde çalışır ki dsh. Biri burada neler olduğunu açıklayabilir mi?

Bu sorunu nasıl düzeltebilirim? sshMümkünse düz ile gitmek için ideal olurdu.

PS multitailİsteğe bağlı komutları yerine getirebilmek istediğim için kullanmak istemiyorum.


Buradan ödeme yapabilir dbitailve indirebilirsiniz .

Yanıtlar:


36

Gördüğünüz, grepGlibc tarafından sağlanan standart bir stdout tamponunun etkisi . En iyi çözüm kullanarak onu devre dışı bırakmaktır --line-buffered(GNU grep, başka hangi uygulamaları destekleyebileceğinden ya da benzer bir şeyden emin olamadım).

Bu neden sadece bazı durumlarda olur?

ssh server "tail -f /var/log/server.log | grep test"

tüm komutu sunucudaki tırnak işaretleri içerisinde çalıştırır - bu nedenle greparabelleğini doldurmayı bekler.

ssh server tail -f /var/log/server.log | grep test

grepYerel makinenizde tailssh kanalı üzerinden gönderilen çıktıda çalışır .

Buradaki en önemli kısım, terminal grepolup olmamasına bağlı olarak davranışını ayarlayan kısmıdır stdin. Çalıştırdığınızda ssh -t, uzaktan kumanda bir kontrol terminaliyle çalışıyor ve böylece uzaktan kumanda grepyerel ayarınız gibi davranıyor.


Detaylı açıklama için çok teşekkürler. Bana şimdi mantıklı geliyor ve script --line-buffered ile beklendiği gibi çalışıyor.
deephacks,

@deephacks Bu durumda, lütfen cevabı kabul etmeyi düşünün - aynı sorunu yaşayan diğerlerine de bir ipucu verir.
peterph

1
grep / glibc en tamponlama onun bağlıdır Stdout'a . ssh tail | greptampon olmadan yerel terminale çıkış yapar. ssh -t "tail|grep"arabelleksiz bir pty'ye çıktı verir. ssh "tail|grep"bir boruya (to sshd) çıkışlar , tamponlanmış (hariç --line-buffered).
dave_thompson_085

2

Şuna bir bak: multitail

MultiTail, bir terminaldeki birden fazla pencerede logfiles ve komut çıkışını izlemenizi, renklendirmenizi, filtrelemenizi ve birleştirmenizi sağlar.

Günlükleri birden fazla sunucuda sıralamak için şunu kullanın:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

3
Fakat bu, bu sorunun bir koşulu olan ssh üzerinden yapmanıza izin vermez. (Ve ayrıca, soru özellikle "multitail kullanmak istemiyorum" der.)
Piskopos

1
@ bishop: Bu eleştirinin kısmen haksızlık olduğunu düşünüyorum çünkü soru multitail kullanmamaya karar vermiş olsa da, yanlış anlaşılmadan kaynaklanıyor gibi görünüyor. Yukarıdaki örnek, keyfi komutların nasıl kullanılacağını ve düzenli kabuk genişlemelerinin nasıl çalıştığını gösterir - multitail <(ssh …) <(ssh …)- sorunun asıl sorunun nasıl cevaplanabileceğini düşünmese de istenen sonucun elde edilmesini sağlar.
Chris Adams,

0

Kullanıcı günlüğüne giriş yapabilirsiniz.

Oluşturduğum bir Java aracı, SSH kullanarak yerel ve uzak günlük dosyalarını okuyabilir. Kullanımı oldukça basittir.

Bazı açıklamalar: https://github.com/pschweitz/insidelog/wiki

İşletim sisteminize uygun, Java Runtime'ınız içinde çalıştırılabilir yerel kavanoz sürümünün sürümünü indirin (java 8_40 veya üstü gerekir):

https://github.com/pschweitz/insidelog/releases

Tam bir dokümantasyon bulabilirsiniz (Github'ın sayfasına da eklenmiş)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.