前回の記事「daemontools で プログラムをデーモン化する。 (1) インストールする。」に引き続き、サービスの登録準備をします。
サービスのディレクトリの作成とデーモン化したいプログラムの用意
$ sudo mkdir /var/daemontools
この下にサービス名でディレクトリを作っていくことになる。
デーモン化したいプログラム例:
$ cat /home/suzu/work/demo_daemon.pl
#!/bin/env perl
# デモ
$|=1;
our $sigDown = '';
$SIG{TERM} = $SIG{INT} = sub {$sigDown = shift;};
our $sigUser = '';
$SIG{USR1} = $SIG{USR2} = sub {$sigUser = shift;};
print "[UP]\n";
our $count = 0;
while(1){
$count++;
print "COUNT: $count\n";
$sigDown and warn("[SIG-$sigDown]\n"), last;
$sigUser and warn("[SIG-$sigUser]\n"), $sigUser='';
sleep 1;
}
printf "[DOWN]\n";
__END__
上記のデモプログラムを登録するために /var/daemontools の下にPATHを用意。
$ sudo mkdir -p /var/daemontools/demo/log
サービス起動用スクリプトを用意
$ cat > /var/daemontools/demo/run
#!/bin/sh
exec 2>&1
exec /home/suzu/work/demo_daemon.pl
$ chmod 775 /var/daemontools/demo/run
ログ出力用スクリプトを用意
$ cat > /var/daemontools/demo/log/run
#!/bin/sh
exec multilog t -'*' +'*COUNT*' ./count -'*' +'*[SIG-*' ./sig +'*' ./main
$ chmod 775 /var/daemontools/demo/log/run
サービス登録と動作確認
サービス登録前のプロセス
$ ps axf
20787 ? Ss 0:00 /bin/sh /command/svscanboot
20789 ? S 0:00 \_ svscan /service
20790 ? S 0:00 \_ readproctitle service errors:
サービス登録
$ sudo ln -s /var/daemontools/demo/ /service/
サービス登録後のプロセス
$ ps axf
20787 ? Ss 0:00 /bin/sh /command/svscanboot
20789 ? S 0:00 \_ svscan /service
30156 ? S 0:00 | \_ supervise demo
30159 ? S 0:00 | | \_ perl /home/suzu/work/demo_daemon.pl
30157 ? S 0:00 | \_ supervise log
30245 ? S 0:00 | \_ multilog t -* +*COUNT* ./count -* +*[SIG-* ./sig +* ./main
20790 ? S 0:00 \_ readproctitle service errors: ...pervise: fatal: unable to start log/run: access denied?supervise: fatal: unable to start log/run: access denied?supervise: fatal: unable to s
ログ確認
$ tai64nlocal < /var/daemontools/demo/log/main/current
$ tai64nlocal < /var/daemontools/demo/log/count/current
$ tai64nlocal < /var/daemontools/demo/log/sig/current
シグナルを送ってみる。
シグナル送信状況をログで確認しながら
$ tail -f /var/daemontools/demo/log/main/current | tai64nlocal
シグナル送信
$ sudo pkill -USR1 -f demo_daemon
ログの例
2009-11-07 07:49:34.327045500 COUNT: 5
2009-11-07 07:49:35.327809500 COUNT: 6
2009-11-07 07:49:36.328742500 COUNT: 7
2009-11-07 07:49:36.406393500 COUNT: 8
2009-11-07 07:49:36.406398500 [SIG-USR1]
2009-11-07 07:49:37.403580500 COUNT: 9
2009-11-07 07:49:38.404430500 COUNT: 10
2009-11-07 07:49:39.405269500 COUNT: 11
停止
$ sudo svc -d /service/demo/
停止後のプロセス
$ ps axf
0787 ? Ss 0:00 /bin/sh /command/svscanboot
20789 ? S 0:00 \_ svscan /service
30156 ? S 0:00 | \_ supervise demo
30157 ? S 0:00 | \_ supervise log
30245 ? S 0:00 | \_ multilog t -* +*COUNT* ./count -* +*[SIG-* ./sig +* ./main
20790 ? S 0:00 \_ readproctitle service errors: ...pervise: fatal: unable to start log/run: access denied?supervise: fatal: unable to start log/run: access denied?supervise: fatal: unable to s