2013-12-23 8 views
6

私は時々タイムアウトしてApacheに殺され、ブラウザに504 Gateway Time-outエラーが送信される原因となるPerl CGIアプリケーションを持っています。私は、しかし、私は、プロファイルデータを読み取ることができない、NYTProfを使用して、このアプリケーションのプロファイリングしようとしています:タイムアウトしたPerl CGIスクリプトのプロファイリング

$ nytprofhtml -f www/cgi-local/nytprof.out 
Reading www/cgi-local/nytprof.out 
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated (refer to TROUBLESHOOTING in the documentation) 

私はsigexit=1 NYTProfオプションを使用しています。ここでは、問題を再現する最小限のCGIスクリプトがあります:

#!/usr/bin/perl -d:NYTProf 

sleep 1 while 1; 

答えて

6

は、以下の信号をキャッチするNYTProfを伝えます:

INT HUP PIPE BUS SEGV 

をしかし、あなたのCGIスクリプトがタイムアウトすると、ApacheはSIGTERMを送信します。

sigexit=term 

、デフォルトの信号に加えて使用することをSIGTERMをキャッチするには:あなたはSIGTERMをキャッチする必要が

sigexit=int,hup,pipe,bus,segv,term 
1

CGI.pmを使用すると、コマンドラインからプログラムを実行し、キー/値のペアとして、あなたのCGIパラメータを渡すために使用することができますdebug modeを持っています。

save your params to a fileに使用できるもう1つの機能があり、そのファイルを後で読み取ることができます。

私が行ったことは、パラメータをファイルに保存し、ブラウザを使用してプログラムを実行するコードが追加されたことです。これは、ブラウザが正しいデータを送信していることを保証するためにも役立ちます。

次に、コードを変更してファイルから読み込み、デバッグしたすべてのものがあるまで必要なだけ実行します。

コマンドラインからプログラムを実行したら、nytprofを使って実行して、何がいつも奪取されているかを把握することができます。 sigexit=1を設定

関連する問題