ziguzagu.org

続:Proclet で起動しているアプリをファイル変更検知して再起動

前の記事をつぶやいたら、@kazeburo さんから、

というのを教えてもらった!

前の記事でははしょったけど、redis、nginx なんかもうごいててまぁ再起動しても一瞬なんだけど、もったいない感があったので、

の通り、gearman worker は App::watcher で変更検知、plackup は -r とか -R で、というふうにしてみた。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use Proclet;
use FindBin ();
use Cwd ();

my $lib = Cwd::abs_path("$FindBin::Bin/../lib");

my $proclet = Proclet->new(color => 1);
$proclet->service(
    tag  => 'gearmand',
    code => 'gearmand -p 7003 --debug 1',
);

$proclet->service(
    tag  => 'gearman-worker',
    code => 'watcher --dir lib --signal HUP -- perl -Ilib script/gearman-worker --jobs Foo',
);

$proclet->service(
    tag  => 'api',
    code => 'plackup -Ilib -p 3000 -R $lib  -s Starlet --workers 2 etc/api.psgi',
);

$proclet->run;

すっきり。cpanfile には以下を入れておくと多分エコ。

on 'develop' => sub {
    requires 'App::watcher';
    if ($^O eq 'linux') {
        requires 'Linux::Inotify2';
    }
    elsif ($^O eq 'darwin') {
        requires 'Mac::FSEvents';
    }
};

同じディレクトリ以下を複数のプロセスで watch してるんだけど、そのへんエコじゃないかもしれないけど。