2

〜1000行のホスト情報を含む入力ファイルから読み取るスクリプトを作成しています。スクリプトは、各ホストに ssh し、リモート ホスト ログ ディレクトリに cd し、最新の日次ログ ファイルを cat します。次に、cat ログ ファイルをローカルにリダイレクトして、パターン マッチングと統計を行います。

私のプログラムの単純化された構造は、while ループで、次のようになります。

while read host
do
    ssh -n name@$host "cd TO LOG DIR AND cat THE LATEST LOGFILE" | matchPattern
done << EOA
    $(awk -F, '{print &7}' $FILEIN)
EOA

ここで、matchPattern は、パターンを照合して統計を行う関数です。

現在、これについて2つの質問があります。

1)最新の日次ログファイルをリモートで見つける方法は? 最新のログファイル名は xxxx2012-05-02.log と一致し、作成された最新のものです。リモートで ls を実行して、xxx​​x2012-05-02.log ファイル名と一致するファイルを見つけることは可能ですか?(ローカルで実行できますが、問題が発生します。 sshコマンドに追加するとき)私が思いつく別の方法は、

cat 'ls -t | head -1'  or
cat $(ls -t | head -1)

ただし、これを ssh に追加すると、ローカルで作成された最新のファイル名がリストされます。これをリモート変数に設定して、cat が正しいファイルを見つけられるようにすることはできますか?

2) ほぼ 1000 のホストがあるため、これを並行して実行できるかどうか疑問に思っています (一度に 20 の ssh を実行し、最初の 20 が終了した後に次の 20 を実行するなど)、各 ssh に & を追加するだけでは十分ではないようです。それ。

どんなアイデアでも大歓迎です!


フォローアップ: こんにちは、皆さん、私は最終的にこれを行うことで最初の問題を解決するためのくだらない方法を見つけました:

ssh -n name@$host "cd $logDir; cat *$logName" | matchPattern

$logName は「今日の日付.log」(2012-05-02.log) です。問題は、二重引用符内でしかローカル変数を使用できないことです。私のログ ファイルは 2012-05-02.log で終わり、このサフィックスで終わるファイルは他にないので、cat *2012-05-02.logリモート マシンでやみくもに実行すると、目的のファイルが cat されます。

4

3 に答える 3

1

2 番目の質問については、並列分散シェルをご覧ください。

http://sourceforge.net/projects/pdsh/

于 2012-05-02T17:12:48.223 に答える
1

最初の質問については、

ssh -n name@$host 'cat $(ls -t /path/to/log/dir/*.log | head -n 1)'

動作するはずです。リモート コマンドを一重引用符で囲んでください。

ssh | matchPattern | analyse2番目の質問では、すべてのものを独自の関数にラップし、それを繰り返します

outstanding=0
while read host
do
    sshMatchPatternStuff &
    outstanding=$((outstanding + 1))
    if [ $outstanding -ge 20 ] ; then
        wait
        outstanding=$((outstanding - 1))
    fi
done << EOA
    $(awk -F, '{print &7}' $FILEIN)
EOA
while [ $outstanding -gt 0 ] ; do
    wait
    outstanding=$((outstanding - 1))
done

(私はあなたが使用していると仮定しますbash。)

ssh | matchPattern | analyseものを独自のscriptxargsに分離し、それを呼び出すためにの並列バリアントを使用する方がよい場合があります。

于 2012-05-02T17:36:20.610 に答える
0

GNU Parallel http://www.gnu.org/software/parallel/がインストールされている場合は、次のことができます。

parallel -j0 --nonall --slf <(awk -F, '{print $7}' servers.txt) 'cd logdir; cat `ls -t | head -1` | grep pattern'

このようにして、リモート サーバー上でマッチングが行われます。完全なログ ファイルを転送してローカルで照合を行う場合は、grep を外部に移動します。

parallel -j0 --nonall --slf <(awk -F, '{print $7}' servers.txt) 'cd logdir; cat `ls -t | head -1`' | grep pattern

GNU Parallel は次の方法で簡単にインストールできます。

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

詳細については、GNU Parallel の紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-05-27T17:17:54.453 に答える