web-dev-qa-db-ja.com

SSHを介して複数のマシンのログファイルをテール

複数のリモートマシンでログファイルを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つの方法が見つかりました…

  1. Sshに-tフラグを追加します。

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
    
  2. リモートコマンドから引用を削除します。

    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-sshdshとまったく同じように機能します。誰かがここで何が起こっているのか説明できますか?

この問題を解決するにはどうすればよいですか?可能であれば、ストレートsshを使用するのが理想的です。

追伸任意のコマンドを実行できるようにしたいので、multitailなどを使用したくありません。

38
deephacks

目に見えるのは、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を実行します。

ここで重要なのは、grepstdinがターミナルであるかどうかに応じてその動作を調整することです。 ssh -tを実行すると、リモートコマンドは制御端末で実行されているため、リモートgrepはローカルのように動作します。

37
peterph

これをチェックしてください: multitail

MultiTailを使用すると、ターミナルの複数のウィンドウでログファイルとコマンド出力を監視し、色付け、フィルター、マージを行うことができます。

複数のサーバーでログをテールするには、以下を使用します。

multitail -l 'ssh user@Host1 "tail -f /path/to/log/file"' -l 'ssh user@Host2 "tail -f /path/to/log/file"'
2
LeoChu

サイドログでチェックアウトできます。

A Java私が作成したツールで、SSHを使用してローカルおよび遠隔のログファイルを読み取ることができます。使用方法はかなり簡単です。

さらにいくつかの説明: https://github.com/pschweitz/insidelog/wiki

Javaランタイム(Java 8_40以上が必要))内で実行可能なネイティブjarリリースのオペレーティングシステムに対応するバージョンをダウンロードするだけです。

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

完全なドキュメントを見つけることができます(Githubのページに埋め込まれています)

0