【问题标题】:How can I limit execution time for a Perl script in IIS?如何限制 IIS 中 Perl 脚本的执行时间?
【发布时间】:2010-09-09 15:55:03
【问题描述】:

这是一个共享主机环境。我控制服务器,但不一定控制内容。我有一个带有 Perl 脚本的客户端,该脚本似乎时不时地失控并占用 50% 的处理器,直到进程被终止。

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

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

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

【问题讨论】:

  • 你能提供更多关于你如何配置它的信息吗?

标签: perl iis iis-6 hosting cgi


【解决方案1】:

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

我已经有一段时间没有在 Windows 上使用 perl 了,虽然 Windows 有点 POSIXy,但我不能保证这会奏效;您必须查看 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);
};

【讨论】:

    【解决方案2】:

    谷歌搜索“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 监控仅在工作进程隔离模式下可用。”

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        关于这个的更新...

        事实证明,这个特定的脚本显然有一点问题,而且 Googlebot 具有“按下它的按钮”并让它发疯的不可思议的能力。该脚本是一个较旧的商业应用程序,它执行日历。显然,它显示了“下个月”和“上个月”的链接,如果你跟随“下个月”太多次,你会掉下悬崖。但是,生成的页面仍然包含“下个月”链接。 Googlebot 会不断地将脚本打死并吞噬处理器。

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

        无论如何,Microsoft 的 Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) 提供了巨大的帮助,因为它让我可以更详细地查看 perl.exe 进程的环境,并且我能够从中确定是 Googlebot 导致的我的问题。

        一旦我知道了这一点(并确定 robots.txt 不能解决问题),我就可以直接使用 IIS 来阻止从 *.googlebot.com 到该站点的所有流量,在这种情况下效果很好,因为我们不在乎 Google 是否索引此内容。

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

        埃里克·朗曼

        【讨论】:

          猜你喜欢
          • 2012-08-25
          • 1970-01-01
          • 1970-01-01
          • 2012-07-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-06
          • 1970-01-01
          相关资源
          最近更新 更多