Ubuntu 12.04の新環境にしてから、Apacheのログに、
[Wed Jan 15 23:31:32.858590 2014] [fcgid:warn] [pid 13565:tid 139709495392128] mod_fcgid: cleanup zombie process 14920
的なfcgidのwarnが記録されやすくなった気がするんだが、
正常なログな気もするが、FCGIの発行するシグナルが変わったのかも・・・
ということで、ちょっと実験してみた。
まず、12.04使い始めてすぐ気づいてたんだが、
Ubuntu 10.04使ってた頃は、FCGI::Requestの際に、
FCGI::Request(\*STDIN,\*STDOUT,\*STDERR,\%ENV,0,FCGI::FAIL_ACCEPT_ON_INTR)
の様に、6番目の引数でFCGI::FAIL_ACCEPT_ON_INTRを指定しないとPerlで%SIGがキャッチできなかったんで、今まではそうやってFCGI使ってた。
だが、これに関しては古いFCGIのバグだったんじゃないかと思うんだが、今では単に、
FCGI::Request
として%SIGのキャッチができる。
FCGI::FAIL_ACCEPT_ON_INTRは指定してもしなくても、今回のwarnには影響ない。
今回の実験は、
foreach my $sig(keys(%SIG)){
$SIG{$sig}=sub{
my $sig=shift;
my @time=localtime;
$time[5]+=1900;
$time[4]++;
for(0..4){
$time[$_]="0$time[$_]" if(length($time[$_])==1);
}
open(LOG,'>>sig.txt');
print LOG "$sig $$ $time[5]-$time[4]-$time[3]T$time[2]:$time[1]:$time[0]\n";
close(LOG);
if($sig eq 'TERM'){
$EXIT=1;exit if(!$BUSY);
}
}
}
こんな感じで、全部のシグナルをキャッチして、
シグナル名、プロセスID、日時をログファイルに記録する感じにした。
$SIG{'TERM'}だけは今までどおり終了するようにした。
結果なんだが、
スクリプトにTERM送った場合も、Apacheの変更適用した場合(HUP?)も、スクリプトにはTERMだけが送られた。
で、TERMでexitするわけだが、その際に例のwarnログが出力された。
試しにexitしない場合も同じだったんで、スクリプトでexitしても問題ないはず。
つまり、warnログはTERMの際に記録されているんで、正常終了のログだと思う・・・
試してないが、exitじゃなくてfinishでループ抜けたら出くなるとかあるかな?
まあ、この件は正常ログだと判断して無視することにする。
今回の実験の際に、明示的に$SIG{'TERM'}設定しなくても終了するようになってる事が判明したが、
ENDサブルーチンは試してないんでkill 9されてる可能性があるかもしれないが、基本的には%SIGはなにもいじらなくて良くなってるのかも。
あと、FCGIのスクリプトで、TERM以外にPIPEやらUSR1等を使ったコードを見ることがあるが、
経験上はTERM以外を確認したことはない。
TERM以外が来ることは無いものと思ってる。