2

次のスクリプトについて考えてみます。

for host in $(get-all-hosts)
do
  (restart-server $host; wait-for-server-to-come-up $host) &
done

ご想像のとおりrestart-server、サーバーを再起動すると、サーバーが起動するまでコマンドwait-for-server-to-come-upがブロックされます(例:)grep -m 1 'server up' <(tail -f /path/to/log)

このスクリプトは、基本的にすべてのサーバーを同時に再起動します。このスクリプトを変更して、一定数のサーバーの後で停止し、1つのサーバーが起動するのを待ってから次の再起動に進み、たとえば最大4台のサーバーがダウンするようにする最も簡単な方法を知りたいです。時間。これを行うことを私が知っている1つの方法は、4つのチャンクで再起動し、各チャンクのすべてのpidを待つことですが、よりスマートなことを行うのはそれほど難しくないことを望んでいます。

解決に向けたいくつかのスクラッチ作業:

デニスのリンクからいくつかのアイデアを使用して、2番目の試み。バニラバッシュソリューションにほぼ理想的:

mkfifo mfifo
exec 3<>mfifo
echo >&3
echo >&3
echo >&3
for host in $(get-all-hosts)
do
  read
  (restart-server $host; wait-for-server-to-come-up $host; echo >&3) &
done <&3

このソリューションに関する私の最大の不満は、すでに使用されているmfifoという名前のキューがまだ存在しないことを前提としていることです。それ以外は問題はなく、私が知る限り期待通りに動作しています。

4

2 に答える 2

2

xargs次のような並列処理機能がありますparallel

echo $(get-all-hosts) | tr ' ' '\n' | xargs -P 4 -n 1 ./blocking-restart

..ここblocking-restartで、単一のサーバーの名前を取得し、サーバーを再起動して、終了するまで待ちます。tr各ホストを独自の行に配置することに注意してください。これは、xargsが期待するものです。

于 2012-06-29T04:05:28.100 に答える
1

ツール(parallelUbuntu / Debianmoreutilsパッケージ内)がここで役立つ場合があります。restart-serverサーバーが復旧するまでブロックするようにツールを書き直すと、次のような方法でスクリプトを実行できます。

parallel -j 4 restart-server -- $(get-all-hosts)

もちろん、4台のサーバーが復旧しない場合は、すべてが停止します。おそらくそれは望ましいことです。

于 2012-06-29T02:34:36.783 に答える