AN HTTPD ゲストブック/コメント集(2004年7月19日09:41)


中田昭雄 nakata@st.rim.or.jp 2004/07/28 20:41

鷹の巣さん、
gethostbyaddr の話は、わざわざ dig.exe という外部プロセスを起動する必要はないでしょう、という意味です。


鷹の巣 webmaster@sakaguch.com 2004/07/28 01:40

中田昭雄 nakata@st.rim.or.jp 2004/07/19 17:52 様
ご回答ありがとうございました。

> Windows では、IPアドレスの逆引きだけなら Perlの関数の gethostbyaddr などを使う方がよいでしょう。

bind for NTのdigコマンドもgethostbyaddrを使用しています。多分perlの関数と同じことになるのではと考えています。
逆引きを全て止めてもperlのモジュール内に処理が移ってしまうと、時間切れの処理が正常に機能せず、Error 500が出てしまいます。
trace.logを取っていたので、処理時間のかかる問題のスクリプトは解っているのですが、現在は手の打ちようがありません。
perlのモジュールを使用しているところをBASP21に変更しようと検討中です。


中田昭雄 nakata@st.rim.or.jp 2004/07/19 17:52

鷹の巣さん、
ネットワークアプリケーションを確実に終了処理させるのは結構ややこしいので、Windows では、IPアドレスの逆引きだけなら Perlの関数の gethostbyaddr などを使う方がよいでしょう。


鷹の巣 webmaster@sakaguch.com 2004/07/19 09:41

鷹の巣です。中田さん、いつもお世話になっております。

Error 500(Internal Server Error:予期しないサーバエラーのため、要求を実行できなかった。)について

私のサイトでは、1.42mを使用する以前から、Error 500がよく発生していました。このエラーが発生している後にサーバを調べますと、少なくとも2個以上のperl.exeのゾンビプロセス(CPU使用時間が0:00:00の無反応プロセス?)が発生していました。

鷹の巣@松阪 webmaster@sakaguch.com 2004/02/04 20:14の追記に書いていましたが、『perlを5.6より5.8に移行させると、500番のエラーが発生してもperl.exeのゾンビプロセスが一度も発生しなくなりました。』というのは、一部を除かないといけないことが解りました。

perl5.8で、全てのperlスクリプトに以下の時間切れの処理を追加しても、Error 500が出てゾンビプロセスが発生しています。

# 時間切れの処理のperlスクリプト例(ActivePerl 5.8を使用のこと)  
# プログラムの先頭で実行して、3秒で終了する例
# 参考URL http://www.aka.ne.jp/~deguchi/hobby/iden/cgi.html#timeout
alarm(3);
$SIG{'ALRM'} = 'kill_process';

while(){ # 無限ループ
print "*";
}
exit;

#サブルーチン
sub kill_process {
# …適切な終了処理…
exit;
}
trace.logを取っていて解ったことなのですが、perlのスクリプト中に
open ( STDOUT , "| D:/WWW/himitsu/binary/dig.exe 192.0.34.166" ); # IPアドレスの逆引きを実施 
の様なdigコマンドを別プロセスで実行している行があった場合、逆引き出来ないIPアドレスからアクセスがあると、perlスクリプトの時間切れの処理が正常に機能しないことが解りました。
2004年7月8日より逆引きを使用しない様にして、現在は経過観察中です。