启动由perl脚本调用的外部二进制文件时出现奇怪的apache行为

时间:2013-11-21 09:40:32

标签: apache crash segmentation-fault cgi rc

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

问题在于:当我启动我的服务器时,一切顺利,除了我的perl脚本调用我的二进制崩溃之一(内核段错误)。

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

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

总而言之,一旦服务器完全启动,当httpd在命令行启动时,我的Web服务才起作用(没有外部二进制崩溃)!

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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