こんにちは、
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 に増やしました。
私がどこを見るべきかについて誰か考えがありますか? 何かご意見は?
助けてくれてありがとう