我目前正在设置一个由 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)通过使用例如 setrlimit(RLIMIT_STACK, $softlimit, $hardlimit); 直接在我的 perl 脚本中定义堆栈大小;
因此,这个新的堆栈大小限制现在直接从我的 perl 脚本传递到我的二进制文件。