1

こんにちは、

Oracle64 ビット (Red Hat クローン) で apache 2.2.3 を実行していますが、問題で壁にぶつかっています。MIME::Lite を利用して sendmail 経由でメールを送信するプログラムを持っています (申し訳ありませんが、実行している sendmail または mod_perl のバージョンはわかりませんが、すぐにわかるように、sendmail の部分は無関係だと思います)

時々、Apache は segfault (11) を起こし、MIME::Lite モジュールを深く掘り下げると、次の行にあることがわかります。

open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n";  (this is in MIME::Lite)

ここで、自動的に sendmail を疑いますが、同じ行で /bin/cat を使用すると (図のように):

open SENDMAIL, "|/bin/cat" 

Apacheはまだセグメンテーション違反です。

Apache プロセスに strace をアタッチすると、次のように表示されます: (クラッシュしない場合)

12907 write(2, "SENDMAIL send_by_sendmail 1\n", 28) = 28
12907 write(2, "SENDMAIL /usr/lib/sendmail -t -o"..., 40) = 40
12907 pipe([24, 26])                    = 0
12907 pipe([28, 29])                    = 0
12907 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,     child_tidptr=0x2b4bcbbd75d0) = 13186

「SENDMAIL sent_by_sendmail」は私のコメントです。パイプが開いているのがはっきりとわかります。クラッシュすると、次のように表示されます。

10805 write(2, "SENDMAIL send_by_sendmail (for y"..., 40) = 40
10805 --- SIGSEGV (Segmentation fault) @ 0 (0) ---

ここで、パイプしないことに注意してください。GDB を試してみましたが、実際には何も表示されませんでした。

最後に、mod_perl と通常の cgi を実行する簡単なプログラムを作成しました。

 print header();
 print "test";

 open SENDMAIL, "|/bin/cat" or Carp::croak "open |sendmailcmd: $!\n";
 print SENDMAIL "foodaddy";
 close SENDMAIL;
 print "test done <br/>";

mod_perl の下では正常にクラッシュしました。

私の分析によると、ファイル ハンドルを開こうとしていることに関係しているとのことです。パイピング関数は false または破損したファイル ハンドルを返します。

また、ファイル記述子の制限をサイコロなしで 2048 に増やしました。

私がどこを見るべきかについて誰か考えがありますか? 何かご意見は?

助けてくれてありがとう

4

2 に答える 2

0

同じ症状で始まった問題を追跡するのに長い時間を費やしました. 私は最終的に、 Test::More が mod_perl でうまく機能しないことを発見しました。このモジュールをコードから削除すると、問題が解決したようです (これまでのところ!)。これ以上深くは追っていませんが、問題は実際には Test::Builder にあるのではないかと思います。

于 2011-07-22T08:13:59.017 に答える