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

启动由perl脚本调用的外部二进制文件时apache的奇怪行为,apache,crash,segmentation-fault,cgi,rc,Apache,Crash,Segmentation Fault,Cgi,Rc,我目前正在设置一个由apache支持的web服务,并在CENTOS 6.4上运行。 该服务使用perl脚本(cgi-bin),特别是外部自制的fortran编译二进制文件 问题是:当我启动服务器时,一切都很顺利,除了一个二进制文件在被perl脚本调用时系统性崩溃(带有内核segfault) 如果我手动重新启动httpd服务(在命令行:service httpd restart),那么问题就完全解决了。 我检查了apache/系统日志,没有发现任何可疑之处 似乎只有在通过/etc/rc[0-6].

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

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

如果我手动重新启动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加上'ulimit-S-S unlimited')

作为一种解决方法,我使用BSD::Resource module()在我的perl脚本中直接定义stacksize,例如setrlimit(RLIMIT_STACK,$softlimit,$hardlimit)


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

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

感谢您的输入,但这并不合适:当用户要求时,二进制文件通过web表单启动。这不是一个系统服务,而是一个“按需”执行。好的,我重新阅读了你的问题,现在我明白你的意思了。听起来httpd服务可能启动得太快了,因为当您稍后重新启动它时,它就解决了问题。也许以定时延迟启动httpd服务(在其中一个rc脚本中使用
at
)可以解决问题?聪明的解决方法,但仍然不起作用:即使在最后一个rc脚本后几分钟计划重新启动httpd,问题仍然存在。似乎必须手动(在提示下)重新启动apache才能正确运行。奇怪。我想知道这是否是权限问题。当您手动重新启动httpd服务时,您是否可能是以不同于rc脚本启动服务时服务运行所使用的用户的身份重新启动httpd服务?或者,这可能是一个相对路径问题。在手动重新启动服务时,是否存在在相对路径中查找文件的内容是正确的,但在rc脚本尝试启动它时会被破坏?不幸的是,您的所有建议都是否定的:rc启动脚本和手动重新启动脚本完全相同,并且都由root用户调用。所有权限和路径都正确。