我在一個Oracle64位(紅帽克隆)上運行apache 2.2.3,並且遇到一個磚牆問題。我有一個利用MIME :: Lite通過sendmail發送郵件的程序(我很抱歉,不確定我運行的sendmail或mod_perl的版本是什麼,儘管我確實相信sendmail部分是無關緊要的,正如你稍後會看到的那樣)
有時,Apache將段錯誤(11),並深挖的MIME ::精簡版模塊,我看到它是以下行:
open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n"; (this is in MIME::Lite)
現在,一會就自動嫌疑sendmail,但它如果我在同一行使用/ bin/cat(如圖所示):
open SENDMAIL, "|/bin/cat"
apache仍然segfaults。
我連着一個strace的apache的進程,看到以下內容: (當它不會崩潰)
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,沒有骰子。
有沒有人有什麼想法,我應該看看?有什麼想法嗎?
我很感謝幫助