gpt4 book ai didi

perl - 如何避免在 Apache 1.3 下运行的 Perl CGI 脚本中出现僵尸?

转载 作者:行者123 更新时间:2023-12-04 11:32:08 24 4
gpt4 key购买 nike

各种 Perl 脚本(服务器端包含)正在调用网站上具有许多功能的 Perl 模块。
编辑:
脚本使用 使用库 从文件夹中引用库。
在繁忙时期,脚本(而不是库)会变成僵尸并使服务器重载。

服务器列出:

319 ?        Z      0:00 [scriptname1.pl] <defunct>    
320 ? Z 0:00 [scriptname2.pl] <defunct>
321 ? Z 0:00 [scriptname3.pl] <defunct>

我有数百个实例。

编辑:
除了 SSI 指令,我们没有使用 fork、system 或 exec
<!--#exec cgi="/cgi-bin/scriptname.pl"-->

据我所知,在这种情况下 httpd 本身将是该进程的所有者。
MaxRequestPerChild 设置为 0,这不应该让父进程在子进程完成之前死亡。

到目前为止,我们认为暂时挂起一些脚本有助于服务器处理已失效的进程并防止其崩溃,但毫无疑问,僵尸进程仍在形成。
显然 gbacon 似乎与他的理论最接近事实,即服务器无法应对负载。

什么可能导致 httpd 放弃这些进程?
是否有任何最佳实践来防止这些情况发生?

谢谢

答:
重点是罗布。
正如他所说,生成 SSI 的 CGI 脚本不会处理这些 SSI。 SSI 的评估发生在 Apache 1.3 请求周期中 CGI 的运行之前。 Apache 2.0 及更高版本已修复此问题,以便 CGI 可以生成 SSI 命令。

由于我们在 Apache 1.3 上运行,因此对于每个页面 View ,SSI 都会变成无效进程。尽管服务器试图清除它们,但由于运行任务太忙而无法成功。结果,服务器翻倒并没有响应。
作为一个短期解决方案,我们审查了所有 SSI 并将一些进程移至客户端以释放服务器资源并给它时间进行清理。
后来我们升级到 Apache 2.2。

最佳答案

比最佳实践更多的创可贴,但有时你可以摆脱简单

$SIG{CHLD} = "IGNORE";

根据 perlipc documentation

On most Unix platforms, the CHLD (sometimes also known as CLD) signal has special behavior with respect to a value of 'IGNORE'. Setting $SIG{CHLD} to 'IGNORE' on such a platform has the effect of not creating zombie processes when the parent process fails to wait() on its child processes (i.e., child processes are automatically reaped). Calling wait() with $SIG{CHLD} set to 'IGNORE' usually returns -1 on such platforms.



如果您关心子进程的退出状态,则需要通过调用 wait 来收集它们(通常称为“收割”)或 waitpid .尽管名字令人毛骨悚然,但僵尸只是一个已退出但尚未获得状态的子进程。

如果您的 Perl 程序本身就是成为僵尸的子进程,这意味着它们的父进程(那些 fork 并忘记您的代码的进程)需要自己清理。进程无法阻止自己变成僵尸。

关于perl - 如何避免在 Apache 1.3 下运行的 Perl CGI 脚本中出现僵尸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2022140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com