SSH経由で複数のシステムのテールログファイルを表示する

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次のコマンドを実行し、リモートコンピュータのファイルに「test」を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-ssh同じ作業方法を試しましたdsh。何が起こっているのかを説明できる人はいますか?

この問題をどのように解決できますか?可能であれば、直線トラックを使用するのが理想的ですssh

multitailPSランダムなコマンドを実行できるようにしたいので、それと同じものを使用したくありません。

ベストアンサー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チャンネルを介して送信された出力を実行しますgreptail

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

おすすめ記事