FreeBSD・OpenBSDと他で ps -e の動作が違ってハマってしまいましたが、Proclet という簡単なsupervisor・プロセス管理モジュールをCPANにあげました。
Proclet - minimalistic Supervisor
https://metacpan.org/module/Proclet
GrowthForecastでは、growthforecast.pl というスクリプトを実行するだけでWebサーバと2つのWorkerが起動します。CloudForecastのように個別に実行が必要になると使うのも面倒ですよね。
growthforecast.pl を実行後、pstreeで見るとこうなってます。growthforecast.plがsupervisor的に動作し、終了したプロセスがあれば自動で起動し直します。
-+= 70330 kazeburo perl growthforecast.pl
|--- 70332 kazeburo growthforecast.pl (GrowthForecast::Worker 1min)
|--- 70333 kazeburo growthforecast.pl (GrowthForecast::Worker)
\-+- 70334 kazeburo growthforecast.pl (GrowthForecast::Web)
|--- 70335 kazeburo growthforecast.pl (GrowthForecast::Web)
|--- 70336 kazeburo growthforecast.pl (GrowthForecast::Web)
|--- 70337 kazeburo growthforecast.pl (GrowthForecast::Web)
\--- 70338 kazeburo growthforecast.pl (GrowthForecast::Web)
GrowthForecastでこの動作を実現する為に、STFの実装を参考にし(パクリ)つつParallel::PreforkとPrallel::ScoreBoardを利用しています。
Proclet はgrowthforecast.plのようなsupervisorを実現するモジュールで、Parallel::PreforkのHook機構だけを使って実装されています。
use Proclet;
my $proclet = Proclet->new;
$proclet->service(
code => sub {
my $worker = MyWorker->new;
$worker->run;
},
worker => 2
);
$proclet->service(
code => sub {
my $app = MyWeb->to_psgi;
my $loader = Plack::Loader->load(
'Starlet',
port => $port,
host => $host || 0,
max_workers => 4,
);
$loader->run($app);
},
);
$proclet->run;
service メソッドで動かす物を登録していきます。codeに動かすcoderef、workerに起動するプロセス数を指定します。プロセス数のデフォルトは「1」。最後にrunメソッドを呼ぶと内部でループが回り、プロセス起動・監視します。非常にシンプルですね
GrowthForecastはこっちに切り替える予定です