【问题标题】:Strange apache behaviour when lauching an external binary called by a perl script启动由 perl 脚本调用的外部二进制文件时出现奇怪的 apache 行为
【发布时间】:2014-04-22 20:24:28
【问题描述】:

我目前正在设置一个由 apache 提供支持并在 CENTOS 6.4 上运行的 Web 服务。 该服务使用 perl 脚本 (cgi-bin) 启动特定的外部自制 fortran 编译二进制文件。

问题是:当我启动我的服务器时,一切都很顺利,只是我的一个二进制文件在被我的 perl 脚本调用时系统性地崩溃(带有内核段错误)。

如果我手动重启 httpd 服务(在命令行:service httpd restart),问题就完全解决了。 我检查了 apache/系统日志,没有发现任何可疑的东西。

似乎只有在 /etc/rc[0-6].d 启动指令启动 httpd 时才会出现问题。我尝试将http的启动顺序(默认为S85httpd)更改为任何其他位置,但没有成功。

总而言之,我的 Web 服务只有在服务器完全启动后在命令行启动 httpd 时才能正常运行(没有外部二进制崩溃)!

[编辑] 此问题现已解决:

我的 fortran 二进制文件处理非常大的数组和需要无限堆栈大小的复杂函数。

尽管堆栈大小限制是在系统范围内定义的(在 /etc/security/limits.conf 中),但出于任何原因,“apache/perl/fortran 二进制”集成似乎并不知道这一点(导致我的二进制文件每次被调用时都会崩溃)。 相反,当我在 shell 提示符下手动重新启动 apache 时,堆栈大小限制已正确传递(.bashrc with 'ulimit -S -s unlimited')。

作为一种解决方法,我使用 BSD::Resource 模块 (http://metacpan.org/pod/BSD::Resource) 直接在我的 perl 脚本中定义堆栈大小,例如使用setrlimit(RLIMIT_STACK, $softlimit, $hardlimit);

因此,这个新的堆栈大小限制现在直接从我的 perl 脚本传递到我的二进制文件。

【问题讨论】:

    标签: apache crash segmentation-fault cgi rc


    【解决方案1】:

    我以前也遇到过类似的问题。也许解决此问题的一种方法是将二进制文件置于“延迟启动”状态,以便它在系统上的所有其他内容运行后启动。一种方法是在您的 /etc/rc.local 脚本中放置一个at 作业,以在 X 分钟内启动二进制文件。

    【讨论】:

    • 感谢您的输入,但它不适合:当用户要求时,二进制文件是通过 Web 表单启动的。它不是系统服务,而是“按需”执行。
    • 好的,我重新阅读了你的问题,现在我明白你的意思了。听起来 httpd 服务可能启动得太早了,因为当您稍后重新启动它时,它可以解决问题。也许定时延迟启动 httpd 服务(在 rc 脚本之一中使用 at)可以解决问题?
    • 智能解决方法,但仍然无法正常工作:即使在最后一个 rc 脚本后几分钟安排了 httpd 重启,问题仍然存在。看来 apache 必须手动重启(在提示符下)才能正常运行。
    • 奇怪。我想知道这是否是权限问题。是否有可能当您手动重新启动 httpd 服务时,您以与 rc 脚本启动服务时运行该服务的用户不同的用户身份执行此操作?或者,也许这是一个相对路径问题。当您手动重新启动服务时,是否会在相对路径中寻找正确的文件,但在 rc 脚本尝试启动它时会损坏?
    • 很遗憾,您的所有建议都没有:rc 启动脚本和手动重启脚本完全相同,都是由 root 用户调用的。所有权限和路径都是正确的。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多