分析超时的Perl CGI脚本

时间:2013-12-23 07:54:24

标签: perl cgi http-status-code-504 devel-nytprof

我有一个Perl CGI应用程序有时会超时,导致它被Apache杀死并且504 Gateway Time-out错误被发送到浏览器。我试图使用NYTProf来分析这个应用程序,但我无法读取配置文件数据:

 $ 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;

2 个答案:

答案 0 :(得分:6)

设置sigexit=1告诉NYTProf捕获以下信号:

INT HUP PIPE BUS SEGV

但是,当您的CGI脚本超时时,Apache会发送SIGTERM。你需要抓住SIGTERM

sigexit=term

除了默认信号之外,要捕捉SIGTERM,请使用:

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

答案 1 :(得分:1)

CGI.pm有一个debug mode,可用于从命令行运行程序,并将CGI参数作为键/值对传递。

它还有另一个功能,您可以使用save your params to a file,然后稍后再读取该文件。

我所做的是添加代码以将params保存到文件中,并通过浏览器运行我的程序。这也有助于我确保浏览器正在发送正确的数据。

然后我更改代码以从文件中读取params,并根据需要经常运行它,直到我调试了其他所有内容。

一旦你从命令行运行满意的程序,你就可以通过nytprof运行它来弄清楚什么是一直在运行。