WEBサイトの製作、管理、とかの日記ブログです。

<<   2018年05月   >>
SunMonTueWedThuFriSat
  12345
6789101112
13141516171819
20212223242526
2728293031  
新着記事
カテゴリ
過去ログ
コメント
掲示板
検索
mod_fcgid: cleanup zombie process
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以外が来ることは無いものと思ってる。

この記事へのコメント
名前:
URL
コメント:
この記事へのトラックバック :
whblog 1.5