3

This is a shared hosting environment. I control the server, but not necessarily the content. I've got a client with a Perl script that seems to run out of control every now and then and suck down 50% of the processor until the process is killed.

With ASP scripts, I'm able to restrict the amount of time the script can run, and IIS will simply shut it down after, say, 90 seconds. This doesn't work for Perl scripts, since it's running as a cgi process (and actually launches an external process to execute the script).

Similarly, techniques that look for excess resource consumption in a worker process will likely not see this, since the resource that's being consumed (the processor) is being chewed up by a child process rather than the WP itself.

Is there a way to make IIS abort a Perl script (or other cgi-type process) that's running too long? How??

4

4 回答 4

1

在 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);
};
于 2008-09-16T19:12:47.630 回答
1

关于这个的更新...

事实证明,这个特定的脚本显然有一点问题,而且 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 到该站点的所有流量,在这种情况下效果很好,因为我们没有不关心谷歌是否索引此内容。

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

埃里克朗曼

于 2008-10-01T02:30:30.967 回答
1

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

于 2008-09-16T20:35:35.230 回答
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 监控仅在工作进程隔离模式下可用。”

于 2008-09-16T20:30:20.063 回答