【发布时间】: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