我有一个perl脚本(Cgi / Apache / Windows),它在计算机上执行某些程序,并格式化Web的输出。该脚本大约需要4-5分钟才能完全运行。
我的问题是,当有人在脚本运行时取消页面加载(或关闭Web浏览器)时,服务器中的perl进程将继续运行而不执行任何操作,并保持对所有打开文件的锁定,因此另一个脚本不能跑。该过程永远不会结束,我必须使用“结束进程树”来结束perl.exe和已启动的子进程才能重新运行脚本。
如何确保脚本不会像这样死? (如果脚本继续在后台运行,并在完成时“退出”,那么这是最好的解决方案)
答案 0 :(得分:4)
首先,没有CGI脚本应该运行4-5分钟。
答案 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轮询结果。