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

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

How can I limit execution time for a Perl script in IIS?

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

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

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

是否有办法使IIS中止运行时间太长的Perl脚本(或其他cgi类型的进程)?怎么样??


此更新...

事实证明,该特定脚本显然有点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是否会对此内容编制索引。

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

埃里克·朗曼


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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.\
"
;
        die"alarm\
"
;
    };

    # 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监视仅在工作进程隔离模式下可用。""


推荐阅读