Win32::Jobでジョブ管理

2010-12-24

クリスマスはほんとクルシミますよね、お父さん。

というわけで遅ればせながら24日目は毎度おなじみ覆面ライターが穴埋めをします。もちろんサンタの正体なんて詮索しちゃいけません。

さて、大量のCPANモジュールをインストールしたいとき、もちろんCPANクライアントの引数にモジュール名を列挙してもよいのですが、Win32::Jobを使うとCPANクライアントが立ち上げた子プロセスの始末やタイムアウトの処理などの面倒がなくて楽です。使い方はこんな感じ。この例ではプロンプトが表示されているとか、無限ループに入ってしまったとかで一時間待っても終わらないときは強制的にタイムアウトさせていますが(たまにあるんですよね)、タイムアウトの必要がないプログラムの場合は最後の「$job->run(3600)」の部分を「$job->run(0)」にするとプロセス終了まで待ってくれるようになります。また、もう少し細かなチェックをしたい場合はrunではなくwatchメソッドを使うのが吉です(詳しくはPODをご覧あれ)。

use strict;
use warnings;

my @to_install = qw/
  Plack
  DBIx::Skinny
  Router::Simple
  Amon2
/;

my $job = Win32::Job->new;
for (@to_install) {
  $job->spawn('cpanm.bat', "cpanm -v $_");
}
$job->run(3600) or die "Timeout!";