2008/10/17

多発性骨髄腫の治療薬としてサリドマイドが承認される

サリドマイドを扱ったドキュメンタリーをずいぶん小さい頃にみた記憶はなかなか消えない。生まれながらに手が短かい女性が改造されたAT車を運転したり、薬を製造した工場が石鹸工場に転用された様子なんかを今でも覚えている。
そんな薬が役に立つ病気があるという事で使われるらしい。 まだ製造されていて研究されていたというところを含めて、なんか複雑な感じがしますが少しでも病状が改善されるのであれば素晴しい事だと思います。

サリドマイドの薬害はテレビ番組で見ただけだけれど、最近の子供達はイタイタイ病やサリドマイドといった初期の薬害を教科書や資料集に書かれている以上の情報を知っているのだろうか…。

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を止めれば良さそうなのですが、少しふらつくようです。

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