複数のファイルをテーリングし、その出力をSSH接続にパイプする方法

複数のファイルをテーリングし、その出力をSSH接続にパイプする方法

私たちは現在、ほとんど制御できないLinuxボックスでコマンドを実行しています。このコマンドはログファイルを追跡し、結果をサーバーのアウトバウンドSSH接続にパイプし、出力をファイルにリダイレクトします。

これに使用するコマンドは次のとおりです。

sh -c tail -f /var/log/x/a.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

その後、キャプチャされたログセグメントに対して追加の処理を実行できます。

ただし、以下を使用して添付ログファイルのストリーミング出力を渡すことができるはずです。同じSSH接続。

行為

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

うまくいきますが、2つのログファイルを1つにマージします(各行の前にはそのファイルのソースを表すヘッダーが続きます)。

2つの異なるファイルを出力する必要がありますが、ログサーバーからサーバーへの単一のアウトバウンドSSH接続にのみ適用されます。ログサーバーに対するsudoまたは管理者権限がなく、ログサーバーをインストールするために必要なソフトウェアを取得できません。重要な場合、リモートログサーバーはCentOSを実行しており、私たちのサーバーはUbuntuを実行しています。

出力を2つのファイルに分割する方法はありますか?それとも、逆SSH接続を介して複数のコマンドを並列に実行する別の方法はありますか?

ベストアンサー1

little.control.serverPerlがインストールされている場合は、parallel --embed開発コンピュータで実行してGNU Parallelを使用できます。

parallel --lb --tag tail -f ::: /var/log/x/a.log /var/log/x/b.log |
       ssh [email protected] -T perl -e \''
        $|=1; # if you need less buffering
        open(A, ">", "a.log");open(B, ">", "b.log");
        while(<>) {
           if(s:/var/log/x/a.log\t::) { print A } 
           if(s:/var/log/x/b.log\t::) { print B }
        }'\'

また、ssh -M単一のSSHチャネルで複数のSSHを多重化することも検討してください。

おすすめ記事