0

我目前正在设置一个由 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 脚本传递到我的二进制文件。

4

1 回答 1

0

I've run into similar problems before. Maybe one way to solve this is to put the binary on a 'delayed start', so that it starts after everything else on your system is running. One way to do this is to put an at job in your /etc/rc.local script, to start the binary in X minutes.

于 2013-11-21T10:05:17.723 回答