perlでdaemon処理作成

仕事でdaemon処理を書く機会が増えて、自分が作ってるコードでも応用できないかなぁと調査。
Parallel::Preforkを使う事で、
かなり簡単に複数子プロセスを持つデーモンを作成できることが判明したので、
簡単なコードを書いてみる。

最終的にはQ4Mでキュー処理しつつ、
アプリの画像生成をdaemonで平行処理で走らせる事が最終目標かなー。

・今回やること
daemon処理(複数process常駐) -> syslogでログ書き出し

SYSLOG

1.syslogの設定

※localは0〜7が指定できるらしいので、ここではlocal1を指定.

vim /etc/syslog.conf
-----------
local1.*                                                /var/log/perl-test.log
-----------
2.リスタート
/etc/init.d/syslog restart

DAEMON

1.Parallel::Preforkをインストール
cpan Parallel::Prefork
2.本体を実装
use strict;
use warnings;

use Parallel::Prefork;
#use Sys::Syslog;
use Sys::Syslog qw(:DEFAULT setlogsock);

sub MaxRequestsPerChild(){100}

my $pm = Parallel::Prefork->new({
  max_workers  => 10,
  trap_signals => {
    TERM => 'TERM',
    HUP  => 'TERM',
  }
});

#main
while($pm->signal_received ne 'TERM'){
  #load_config();
  $pm->start and next;

  my $reqs_before_exit = MaxRequestsPerChild;
  $SIG{TERM} = sub {$reqs_before_exit=0};
  while($reqs_before_exit-->0){
    print "hoge";
    _logging("hogehoge");
    sleep(5);
  }
  $pm->finish;  #finish worker process.
}
$pm->wait_all_children; #wait child process.

sub _logging{
  my ($message) = @_;
  setlogsock 'unix';
  openlog(__FILE__, 'pid', 'local1');
  syslog('notice',$message);
  closelog();
}
3.実行する
perl img_creater.pl
4.並列で立ち上がっている事を確認
ps alxf | grep img_creater


5.logの確認
tail -f /var/log/perl-test.log