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はこっちに切り替える予定です
 
 