多くのプロセスを起動する必要があるけれど、負荷分散の目的で同時に起動するプロセスの数を最大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を止めれば良さそうなのですが、少しふらつくようです。
こんな方法でもそこそこ動くものが作れるけれど、標準的な方法が知りたいなぁ…。