Tail file log pada beberapa mesin lebih dari ssh

37

Saya mencoba tailfile log pada beberapa mesin jarak jauh dan meneruskan output ke workstation lokal saya. Saya ingin koneksi ditutup saat menekan Ctrl- C.

Saat ini saya memiliki fungsi berikut yang hampir berfungsi sebagaimana mestinya.

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
}

Koneksi ditutup dan saya menerima output dari tail. TETAPI, ada beberapa jenis buffering yang terjadi karena output datang dalam batch.

Dan inilah bagian yang menyenangkan ...

Saya bisa melihat perilaku buffering yang sama ketika menjalankan yang berikut dan menambahkan "test" ke file /var/log/server.logpada mesin jarak jauh 4-5 kali ...

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

... dan menemukan dua cara untuk menonaktifkannya ...

  1. Tambahkan -t flag ke ssh.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. Hapus kutipan dari perintah jarak jauh.

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

Namun, tak satu pun dari pendekatan ini bekerja untuk fungsi yang dijalankan pada beberapa mesin yang disebutkan di atas.

Saya telah mencoba dsh, yang memiliki perilaku buffering yang sama ketika mengeksekusi.

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

Sama di sini, jika saya menghapus kutipan, buffering hilang dan semuanya berfungsi dengan baik.

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

Juga mencoba parallel-sshyang berfungsi sama persis dengan dsh. Adakah yang bisa menjelaskan apa yang terjadi di sini?

Bagaimana saya memperbaiki masalah ini? Akan ideal untuk pergi dengan lurus sshjika memungkinkan.

PS Saya tidak ingin menggunakan multitailatau serupa karena saya ingin dapat menjalankan perintah sewenang-wenang.

Deephacks
sumber
Anda dapat checkout dbitaildan mengunduhnya dari sini .

Jawaban:

36

Apa yang Anda lihat adalah efek dari buffer stdout standar yang grepdisediakan oleh Glibc. Solusi terbaik adalah menonaktifkannya dengan menggunakan --line-buffered(GNU grep, saya tidak yakin implementasi apa yang mungkin mendukungnya atau yang serupa).

Adapun mengapa ini hanya terjadi dalam beberapa kasus:

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

menjalankan seluruh perintah dalam tanda kutip di server - sehingga grepmenunggu untuk mengisi buffer-nya.

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

berjalan grepdi mesin lokal Anda pada output yang taildikirim melalui saluran ssh.

Bagian kuncinya di sini adalah, yang grepmenyesuaikan perilakunya tergantung pada apakah stdinitu terminal atau tidak. Ketika Anda menjalankan ssh -t, perintah jarak jauh berjalan dengan terminal pengendali dan dengan demikian remote grepberperilaku seperti terminal lokal Anda.

peterph
sumber
Terima kasih banyak untuk penjelasan detailnya. Masuk akal bagi saya sekarang dan skrip berfungsi seperti yang diharapkan dengan --line-buffered.
Deephacks
@deephacks Dalam hal ini tolong pertimbangkan menerima jawaban - itu memberikan petunjuk kepada orang lain yang memiliki masalah yang sama.
peterph
1
buffering grep / glibc tergantung pada stdout -nya . ssh tail | grepkeluaran ke terminal lokal, tidak dibuat-buat. ssh -t "tail|grep"output ke pty, tidak dibuat-buat. ssh "tail|grep"output ke pipa (ke sshd), buffered (kecuali --line-buffered).
dave_thompson_085
2

lihat ini: multitail

MultiTail memungkinkan Anda untuk memantau file log dan output perintah di beberapa jendela di terminal, mewarnai, memfilter dan menggabungkan.

Untuk mengekor log di banyak server gunakan:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
LeoChu
sumber
3
Tapi itu tidak membiarkan Anda melakukannya lebih dari ssh, yang merupakan syarat dari pertanyaan ini. (Dan, juga, pertanyaannya secara spesifik mengatakan "tidak ingin menggunakan multitail".)
uskup
1
@ bishop: Saya pikir kritik ini tidak adil sebagian karena sementara pertanyaannya mungkin tidak menggunakan multitail, tampaknya ini disebabkan oleh kesalahpahaman. Contoh di atas menunjukkan bagaimana menggunakan perintah sewenang-wenang dan ekspansi shell biasa juga bekerja - multitail <(ssh …) <(ssh …)- memungkinkan hasil yang diinginkan bahkan jika bukan bagaimana mereka awalnya berpikir pertanyaan itu bisa dijawab.
Chris Adams
0

Anda dapat memeriksa log in'side.

Alat Java yang saya buat, dapat membaca file log lokal dan jauh menggunakan SSH. Ini cukup mudah digunakan.

Beberapa penjelasan lebih lanjut: https://github.com/pschweitz/insidelog/wiki

Cukup unduh versi yang sesuai dengan sistem operasi Anda, dari rilis jar asli yang dapat dieksekusi dalam Java Runtime Anda (membutuhkan java 8_40 atau lebih tinggi):

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

Anda dapat menemukan dokumentasi lengkap (disematkan dengan dan di halaman Github juga)

Philippe Schweitzer
sumber