如何限制IIS中Perl脚本的执行时间?

时间:2020-03-05 18:56:41  来源:igfitidea点击:

这是一个共享的托管环境。我控制服务器,但不一定控制内容。我有一个带有Perl脚本的客户端,该脚本似乎有时会失控,然后占用50%的处理器,直到进程被杀死。

使用ASP脚本,我可以限制脚本的运行时间,IIS会在90秒后将其关闭。这不适用于Perl脚本,因为它作为cgi进程运行(并实际上启动了一个外部进程来执行脚本)。

同样,在工作进程中寻找过多资源消耗的技术可能不会看到这种情况,因为正在消耗的资源(处理器)是由子进程而不是WP本身咀嚼的。

有没有办法使IIS中止运行时间太长的Perl脚本(或者其他cgi类型的进程)?如何??

解决方案

回答

在UNIX风格的系统上,我将使用捕获ALRM事件的信号处理程序,然后在启动我预期可能会超时的操作之前使用警报功能启动计时器。如果操作完成,我将使用alarm(0)关闭警报并正常退出,否则信号处理程序应将其拾起以正常关闭所有内容。

我有一段时间没有在Windows上使用过perl了,尽管Windows有点POSIXy,但我不能保证这会起作用。我们必须查看perl文档,以查看平台上是否支持信号或者在何种程度上支持信号。

在Perl Cookbook中可以找到有关信号处理以及使用alarm()进行的此类自毁编程的更多详细信息。这是一个简短的示例,该示例摘自另一篇文章,并做了一些修改:

eval {
    # Create signal handler and make it local so it falls out of scope
    # outside the eval block
    local $SIG{ALRM} = sub {
        print "Print this if we time out, then die.\n";
        die "alarm\n";
    };

    # Set the alarm, take your chance running the routine, and turn off
    # the alarm if it completes.
    alarm(90);
    routine_that_might_take_a_while();
    alarm(0);
};

回答

谷歌搜索" iis cpu限制"会带来以下结果:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/38fb0130-b14b-48d5-a0a2-05ca131cf4f2.mspx?mfr=true

" CPU监视功能监视并自动关闭消耗大量CPU时间的工作进程。已为单个应用程序池启用了CPU监视。"

http://technet.microsoft.com/zh-CN/library/cc728189.aspx

"通过使用CPU监视,我们可以监视工作进程的CPU使用率,并有选择地关闭消耗大量CPU时间的工作进程。CPU监视仅在工作进程隔离模式下可用。"

回答

ASP脚本超时适用于所有脚本语言。如果脚本在ASP页中运行,则脚本超时将关闭问题页面。

回答

有关此的更新...

事实证明,这个特定的脚本显然有点bug,而且Googlebot具有"按下按钮"并使其疯狂的超强能力。该脚本是执行日历的较旧的商业应用程序。显然,它显示"下个月"和"上个月"的链接,如果我们多次跟踪"下个月",我们将跌入悬崖。但是,结果页面仍包含"下个月"链接。 Googlebot会不断击败脚本并将其杀死。

奇怪的是,用Disallow:/添加robots.txt并不能解决问题。 Googlebot已经掌握了该脚本并且不会放任不管,否则它就是在无视robots.txt。

无论如何,Microsoft的Process Explorer(http://technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx)是一个巨大的帮助,因为它使我可以更详细地了解perl.exe进程的环境,并且从中我可以确定是造成我的问题的Googlebot。

知道了这一点(并确定robots.txt无法解决问题)后,我便能够直接使用IIS来阻止* .googlebot.com对该网站的所有访问,在这种情况下效果很好,因为我们没有不在乎Google是否将此内容编入索引。

非常感谢大家发表的其他想法!

埃里克·朗曼