当客户端在中间下载时关闭网页时,Perl cgi脚本将继续运行

时间:2010-08-14 13:26:29

标签: windows perl apache cgi

我有一个perl脚本(Cgi / Apache / Windows),它在计算机上执行某些程序,并格式化Web的输出。该脚本大约需要4-5分钟才能完全运行。

我的问题是,当有人在脚本运行时取消页面加载(或关闭Web浏览器)时,服务器中的perl进程将继续运行而不执行任何操作,并保持对所有打开文件的锁定,因此另一个脚本不能跑。该过程永远不会结束,我必须使用“结束进程树”来结束perl.exe和已启动的子进程才能重新运行脚本。

如何确保脚本不会像这样死? (如果脚本继续在后台运行,并在完成时“退出”,那么这是最好的解决方案)

3 个答案:

答案 0 :(得分:4)

首先,没有CGI脚本应该运行4-5分钟。

其次,请参阅Watching Long Running Processes with CGI

答案 1 :(得分:3)

我想说你的设计模式是次优的。 CGI脚本不应该进行任何繁重的处理。它应该是访问数据库,构建页面,并返回结果。 CGI脚本应该花费几分之一秒才能运行。 Apache的设计并未考虑到这个用例。

如果您想要执行长处理作业,那么此作业应该在您的webapp堆栈之外运行。你的CGI脚本可以启动工作,检查它的进程,杀死它等,但不是等待它。用户刷新或ajax轮询可以检查正在运行的作业的状态。

答案 2 :(得分:1)

您可以通过访问STDOUT来检测是否已按下停止按钮。如果用户不再等待您的回答,以下代码将在Apache / IIS CGI上死掉:

eval {
    print STDOUT "foobar" or die "Gone";
};
if ($@) {
    &cleanup;
}
&do_something;

你可能想要打印更聪明的东西......

请注意,您的4-5分钟脚本将自行保留Apache子进程,直到它完成运行。考虑在后台运行脚本并使用AJAX轮询结果。