複数のリモートマシンでログファイルをtail
しようとして、出力をローカルワークステーションに転送しようとしています。を押したときに接続を閉じたい Ctrl-C。
現時点では、ほぼが意図したとおりに機能する次の関数があります。
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
}
接続が閉じ、tail
から出力を受け取ります。しかし、出力はバッチで送られるため、何らかのバッファリングが行われています。
そして、これが楽しい部分です…
以下を実行すると同じバッファリング動作が見られ、ファイルに「テスト」を追加します/var/log/server.log
リモートマシンで4〜5回…
ssh server-01 "tail -f /var/log/server.log | grep test"
…それを無効にする2つの方法が見つかりました…
Sshに-tフラグを追加します。
ssh -t server-01 "tail -f /var/log/server.log | grep test"
リモートコマンドから引用を削除します。
ssh server-01 tail -f /var/log/server.log | grep test
ただし、これらの方法はいずれも、上記の複数のマシンで実行される機能には機能しません。
実行時に同じバッファリング動作をするdshを試しました。
dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"
ここでも同じですが、引用を削除すると、バッファリングがなくなり、すべてが正常に機能します。
dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test
また試してみましたparallel-ssh
はdsh
とまったく同じように機能します。誰かがここで何が起こっているのか説明できますか?
この問題を解決するにはどうすればよいですか?可能であれば、ストレートssh
を使用するのが理想的です。
追伸任意のコマンドを実行できるようにしたいので、multitail
などを使用したくありません。
目に見えるのは、Glibcが提供するgrep
の標準stdoutバッファーの効果です。最善の解決策は、--line-buffered
を使用して無効にすることです(GNU grep、他のどの実装がそれをサポートしているかはわかりません)。
whyについては、これは一部の場合にのみ発生します。
ssh server "tail -f /var/log/server.log | grep test"
サーバー上でコマンド全体を引用符で囲んで実行します-したがって、grep
はバッファーがいっぱいになるまで待機します。
ssh server tail -f /var/log/server.log | grep test
sshチャネルを介して送信された出力grep
でローカルマシンのtail
を実行します。
ここで重要なのは、grep
がstdin
がターミナルであるかどうかに応じてその動作を調整することです。 ssh -t
を実行すると、リモートコマンドは制御端末で実行されているため、リモートgrep
はローカルのように動作します。
これをチェックしてください: multitail
MultiTailを使用すると、ターミナルの複数のウィンドウでログファイルとコマンド出力を監視し、色付け、フィルター、マージを行うことができます。
複数のサーバーでログをテールするには、以下を使用します。
multitail -l 'ssh user@Host1 "tail -f /path/to/log/file"' -l 'ssh user@Host2 "tail -f /path/to/log/file"'
サイドログでチェックアウトできます。
A Java私が作成したツールで、SSHを使用してローカルおよび遠隔のログファイルを読み取ることができます。使用方法はかなり簡単です。
さらにいくつかの説明: https://github.com/pschweitz/insidelog/wiki
Javaランタイム(Java 8_40以上が必要))内で実行可能なネイティブjarリリースのオペレーティングシステムに対応するバージョンをダウンロードするだけです。
https://github.com/pschweitz/insidelog/releases
完全なドキュメントを見つけることができます(Githubのページに埋め込まれています)