2008/10/03

bashで同時平行プロセス数を制限する

多くのプロセスを起動する必要があるけれど、負荷分散の目的で同時に起動するプロセスの数を最大n個に制限する処理をbashで作ってみます。perlならProc::Queueで十分だし実際に以前の仕事では使っていたけれど、今回はbashで簡単な負荷分散を考えてみました。けれど標準的な方法としては、どうやるのが良いんだろう。
とりあえず5秒スリープする1プロセスを起動する毎にファイルを1つ作成して、適宜その数を数えるようにしてみます。 bash内でサポート関数を作成しますが、前提としてテンポラリディレクトリをTEMPDIRシェル変数から読み込みます。

TEMPDIR="$(mktemp -d /tmp/myscript.XXXXX)"
function get_proc_count {
  local i=$(ls "${TEMPDIR}" | wc -l )
  echo $i
}
function exec_cmd {
  uuid="$(uuidgen)"
  touch "${TEMPDIR}/${uuid}"
  "$@"
  rm "${TEMPDIR}/${uuid}"
}
この関数を使って、"sleep 5"を同時平行数2つに制限した上で実行するスクリプトは、こんな感じになりました。
while true
do
  if test "$(get_proc_count)" -lt 2 ; then
    exec_cmd sleep 5 &
  fi
  sleep 1
done
wait
rmdir ${TEMPDIR}
これを実行すると、2個程度(ときどき3個)のプロセスが動き、"sleep 5"の部分を動かしたいプログラムに置き換えれば、簡易な負荷分散が可能になります。3個平行で動いていしまう部分はfunctionを止めれば良さそうなのですが、少しふらつくようです。

こんな方法でもそこそこ動くものが作れるけれど、標準的な方法が知りたいなぁ…。

0 件のコメント: