何千ものノードに接続し、実行されたコマンドに対して約5つの値を返すRHELサーバーのbashで実行されるスクリプトがあります。これはRHELサーバーからのみ情報を収集します。
うまくいきますが、問題は、次のコマンドを実行すると一部のノードがフリーズすることです。
rpm -q <package-name>
rpm --queryformat '%{installtime:date} %{name}\n' -q <package-name>
これで私のスクリプトが確実に停止するので、sshコマンドのタイムアウトを設定し、いくつかのリモートコマンドが実行されるまで長すぎる(例えば10秒)待つとsshセッションを終了したいと思います。このような場合はタイムアウトし、SSHセッションを終了して次のノードに移動したいと思います。どうすればいいですか?
これは、現在の情報を抽出してdumpという変数に保存するスクリプトの一部です。 [私の貧しいスクリプトは無視してください。私はここで初めてです。]
dump=$(ssh -o ServerAliveCountMax=1 -o ServerAliveInterval=10 -o ConnectTimeout=10 -o BatchMode=yes $i "cat /proc/meminfo | grep -i \"memtotal\" | cut -d \":\" -f2 | tr -d \" \" | tr -d \"kB\"; cat /etc/redhat-release | cut -d \" \" -f7; dmidecode | grep -i \"prod\" | grep -vi \"desktop\" | grep -iv \"id\" | cut -d \" \" -f3,4| tr \" \" \"_\" ; uptime | cut -d \" \" -f4,5 | tr \" \" \"_\" | tr -d \",\"; service kdump status 2>/dev/null | tr \" \" \"_\";");
持続時間が長すぎるとタイムアウトする方法はありますか?
私が試したこと:
(ssh -q -o Batchmode=yes -o PasswordAuthentication=no -o ConnectTimeout=1 $i "rpm --queryformat '%{installtime:date} %{name}\n' -q \"kexec-tools\" | cut -d \" \" -f1,2,3,4|tr \" \" \"_\"" > /dev/null) & pid=$!
(sleep 10 && kill -HUP $pid ) 2>/dev/null & watcher=$!
if wait $pid 2>/dev/null; then
pkill -HUP -P $watcher
wait $watcher
else
echo -e "$i Unable to ssh" >> res && continue
fi
ただし、この方法ではリモートrpmコマンドの結果を保存することはできません。
どんな助けでも大変感謝します。
ベストアンサー1
コレクションを並列化するには、GNU Parallelを使用してください。
parallel --slf rhel-nodes --tag --timeout 1000% --onall --retries 3 \
"rpm -q {}; rpm --queryformat '%{installtime:date} %{name}\n' -q {}" \
::: bash bc perl
ノードをに入れます~/.parallel/rhel-nodes
。
--tag
ノード名が出力の前に追加されます。--timeout 1000%
コマンドの実行時間が中央値より10倍長くなると、そのコマンドが終了することを示します。--onall
すべてのコマンドはすべてのサーバーで実行されます。--retries 3
失敗すると、コマンドは最大3回実行されます。::: bash bc perl
テストするパッケージです。パッケージが多いcat packages | parallel ...
場合parallel ... ::: packages
。
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README
詳細
より多くの例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel