0

私は現在、apache を搭載し、CENTOS 6.4 で実行されている Web サービスをセットアップしています。このサービスは、特定の外部自家製 fortran コンパイル済みバイナリを起動する perl スクリプト (cgi-bin) を使用します。

問題は次のとおりです。サーバーを起動すると、perl スクリプトによって呼び出されたときにバイナリの 1 つが (カーネル segfault で) 体系的にクラッシュすることを除いて、すべてがうまくいきます。

httpd サービスを手動で再起動すると (コマンド ラインで service httpd restart)、問題は完全に修正されます。Apache/システム ログを調べましたが、疑わしいものは何も見つかりませんでした。

この問題は、httpd が /etc/rc[0-6].d 起動ディレクティブによって起動された場合にのみ発生するようです。http (デフォルトでは S85httpd) の起動順序を他の位置に変更しようとしましたが、成功しませんでした。

要約すると、私の Web サービスは、サーバーが完全に起動してからコマンド ラインで httpd を起動した場合にのみ機能します (外部バイナリ クラッシュは発生しません)。

[編集] この問題は解決されました:

私の fortran バイナリは、無制限のスタック サイズを必要とする非常に大きな配列と複雑な関数を処理します。

スタック サイズの制限はシステム全体に基づいて (/etc/security/limits.conf で) 定義されていたにもかかわらず、何らかの理由で、「apache/perl/fortran バイナリ」アンサンブルはそれを認識していなかったようです (バイナリが呼び出されるたびにクラッシュします)。逆に、シェルプロンプトで手動でApacheを再起動すると、スタックサイズの制限が正しく通過しました(「ulimit -S -s unlimited」を使用した.bashrc)。

回避策として、BSD::Resource モジュール ( http://metacpan.org/pod/BSD::Resource ) を使用して、たとえば setrlimit(RLIMIT_STACK, $softlimit, $hardlimit); を使用して、perl スクリプトでスタックサイズを直接定義しました。

したがって、この新しいスタック サイズ制限は、perl スクリプトからバイナリに直接渡されるようになりました。

4

1 に答える 1