Saya mencoba tail
file 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.log
pada mesin jarak jauh 4-5 kali ...
ssh server-01 "tail -f /var/log/server.log | grep test"
... dan menemukan dua cara untuk menonaktifkannya ...
Tambahkan -t flag ke ssh.
ssh -t server-01 "tail -f /var/log/server.log | grep test"
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-ssh
yang 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 ssh
jika memungkinkan.
PS Saya tidak ingin menggunakan multitail
atau serupa karena saya ingin dapat menjalankan perintah sewenang-wenang.
dbitail
dan mengunduhnya dari sini .Jawaban:
Apa yang Anda lihat adalah efek dari buffer stdout standar yang
grep
disediakan 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:
menjalankan seluruh perintah dalam tanda kutip di server - sehingga
grep
menunggu untuk mengisi buffer-nya.berjalan
grep
di mesin lokal Anda pada output yangtail
dikirim melalui saluran ssh.Bagian kuncinya di sini adalah, yang
grep
menyesuaikan perilakunya tergantung pada apakahstdin
itu terminal atau tidak. Ketika Anda menjalankanssh -t
, perintah jarak jauh berjalan dengan terminal pengendali dan dengan demikian remotegrep
berperilaku seperti terminal lokal Anda.sumber
ssh tail | grep
keluaran ke terminal lokal, tidak dibuat-buat.ssh -t "tail|grep"
output ke pty, tidak dibuat-buat.ssh "tail|grep"
output ke pipa (kesshd
), buffered (kecuali--line-buffered
).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:
sumber
multitail <(ssh …) <(ssh …)
- memungkinkan hasil yang diinginkan bahkan jika bukan bagaimana mereka awalnya berpikir pertanyaan itu bisa dijawab.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)
sumber