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

3
这是一个共享托管环境。我控制着服务器,但不一定控制内容。我的客户有一个Perl脚本,似乎偶尔会失控,占用50%的处理器,直到进程被杀死。
对于ASP脚本,我可以限制脚本运行的时间,IIS将在90秒后关闭它。但这对Perl脚本无效,因为它作为cgi进程运行(实际上启动外部进程来执行脚本)。
同样,寻找工作进程中过度资源消耗的技术可能看不到这一点,因为正在被消耗的资源(处理器)是由子进程而不是WP本身所吞噬的。
有没有办法使IIS中止运行时间过长的Perl脚本(或其他cgi类型的进程)?如何做到?

你能提供更多关于你如何配置它的信息吗? - Leon Timmermans
4个回答

1
在类UNIX系统上,我会使用信号处理程序来捕获ALRM事件,然后使用alarm函数在开始可能超时的操作之前启动计时器。如果操作完成,我将使用alarm(0)关闭警报并正常退出,否则信号处理程序应该捕获它以优雅地关闭所有内容。
我已经有一段时间没有在Windows上使用Perl了,尽管Windows有点类POSIX,但我不能保证这将起作用;您必须查看Perl文档以了解信号在您的平台上是否受支持以及在何种程度上受支持。
关于信号处理和使用alarm()进行自毁式编程的更详细信息可以在Perl Cookbook中找到。下面是从另一个帖子中提取并稍加修改的简短示例:
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);
};

1

关于这个问题的最新进展...

事实证明,这个特定的脚本似乎有点小毛病,而Googlebot有着惊人的能力来“按它的按钮”并让它发疯。该脚本是一个旧的商业应用程序,用于日历。显然,它显示了“下个月”和“上个月”的链接,如果你跟随“下个月”太多次,你就会掉下悬崖。然而,结果页面仍然包括“下个月”的链接。Googlebot会不断地折磨脚本并消耗处理器。

奇怪的是,添加一个带有Disallow: /的robots.txt并没有解决问题。要么Googlebot已经掌握了脚本并且不会放手,要么它只是忽略了robots.txt。

无论如何,微软的Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)非常有帮助,因为它允许我更详细地查看perl.exe进程的环境,并且我能够从中确定是Googlebot导致了我的问题。

一旦我知道了这一点(并确定 robots.txt 无法解决问题),我就能够直接使用 IIS 阻止所有来自 *.googlebot.com 的流量访问此站点,在这种情况下,这种方法效果很好,因为我们不在意谷歌是否索引此内容。

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

Eric Longman


1

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


0

在谷歌上搜索“iis cpu limit”会得到以下结果:

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

“CPU 监控功能可以监控并自动关闭消耗大量 CPU 时间的工作进程。CPU 监控已为各个应用程序池启用。”

http://technet.microsoft.com/en-us/library/cc728189.aspx

通过使用CPU监控,您可以监视工作进程的CPU使用情况,并选择关闭消耗大量CPU时间的工作进程。CPU监控仅在工作进程隔离模式下可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接