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
次のコマンドを実行し、リモートコンピュータのファイルに「test」を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
PSランダムなコマンドを実行できるようにしたいので、それと同じものを使用したくありません。
答え1
grep
あなたが見ているのは、Glibcが提供する標準stdoutバッファの効果です。最善の解決策は--line-buffered
(GNU grep、他の実装がそれをサポートしているかどうかわからない)を使用して無効にすることです。
についてはなぜこれは特定の状況でのみ発生します。
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
ローカルコマンドのように機能します。
答え2
これを見てください:multitail
MultiTailを使用すると、端末の複数のウィンドウでログファイルとコマンド出力を監視、カラー化、フィルタリング、およびマージできます。
複数のサーバーでログを追跡するには、次を使用します。
multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
答え3
サイドログで見ることができます。
SSHを使用して、ローカルおよびリモートのログファイルを読み取ることができるJavaツールを作成しました。使用するのはとても簡単です。
さらなる説明:https://github.com/pschweitz/insidelog/wiki
オペレーティングシステムに対応するバージョン、Javaランタイムで実行可能なデフォルトのjarバージョンをダウンロードしてください(Java 8_40以降が必要)。
https://github.com/pschweitz/insidelog/releases
ドキュメント全体を見つけることができます(Githubページにも含まれています)。