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
5.logの確認
tail -f /var/log/perl-test.log