1

各サーバーに SSH で接続して、サーバーのリストの負荷とメモリ情報を取得するスクリプトを作成しました。ただし、約 20 台のサーバーがあるため、スクリプトの終了を待つのはあまり効率的ではありません。そのため、スクリプトの出力をファイルに書き込む crontab を作成するのは面白いのではないかと考えたので、20 台のサーバーの負荷とメモリの情報を知る必要があるときはいつでも、このファイルを cat するだけで済みます。ただし、crontab の実行中にこのファイルを cat すると、不完全な情報が表示されます。これは、スクリプトの出力が、終了時に一度にではなく、1 行ずつファイルに書き込まれるためです。これを機能させるために何をする必要があるのだろうか...

私のcrontab:

* * * * * (date;~/bin/RUP_ssh) &> ~/bin/RUP.out

私のbashスクリプト(RUP_ssh):

for comp in `cat ~/bin/servers`; do
    ssh $comp ~/bin/ca
done

ありがとう、

ニーフパールショーネン

4

2 に答える 2

2

次のように、出力を一時ファイルにバッファリングしてから、一度にすべて出力することができます。

outputbuffer=`mktemp` # Create a new temporary file, usually in /tmp/
trap "rm '$outputbuffer'" EXIT # Remove the temporary file if we exit early.
for comp in `cat ~/bin/servers`; do
    ssh $comp ~/bin/ca >> "$outputbuffer" # gather info to buffer file
done
cat "$outputbuffer" # print buffer to stdout
# rm "$outputbuffer" # delete temporary file, not necessary when using trap
于 2012-11-08T11:04:13.387 に答える
0

mem/load データがどのホストから来たかを識別するための文字列があると仮定すると、各結果が入ってくるたびに txt ファイルを更新できます。データ ブロックが 1 行の長さであると仮定すると、

for comp in `cat ~/bin/servers`; do
    output=$( ssh $comp ~/bin/ca )
    # remove old mem/load data for $comp from RUP.out
    sed -i '/'"$comp"'/d' RUP.out # this assumes that the string "$comp" is
                                  # integrated into the output from ca, and
                                  # not elsewhere
    echo "$output" >> RUP.out
done

これは約の出力に応じて適応させることができます。ネット上で sed に関するヘルプがたくさんあります。

于 2013-02-01T14:03:53.753 に答える