〜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 を実行して、xxxx2012-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 されます。