Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Apache 出現 child pid XXXX exit signal Segmentation fault (11) 該如何處理?
post by tommy @ 25 四月, 2007 21:30

這幾天發現家裡的 apache 每隔幾分鐘就產生一次類似下面的訊息:

[Wed Apr 25 21:13:54 2007] [notice] child pid 3204604 exit signal Segmentation fault (11) 

不過.... 同一個時間, 有一堆 request 在存取 apache (好像多數都是 bot...), 到底是那個地方造成的呢?

為了找出原因, 終於想到利用 strace 這個指令, 來針對每一個 apache 的 process 來追蹤看看. 所以寫了下面的 script 來用:

#!/bin/sh
 
while [ "1" == "1" ]; do
APACHE_LIST=`ps -ef | grep apache | grep ^www | awk '{ print $2; }'`
for i in $APACHE_LIST; do
if [ ! -e $i.log ]; then
echo "strace $i"
strace -p $i 2> $i.log &
fi
done
echo "wait"
sleep 60s
done

在執行 apache 之後, 就執行上頭的 script, 這個 script 把 strace 每一個 apache 的程式, 由於 apache 的每一個程式, 在執行一段時間後, 會結束舊的程式並產生一個新的程式, 所以上頭的 script 會每隔一分鐘檢查一次目前所有的 apache 程式, 如果沒有相關的記錄, 就表示是新產生的, 就再 strace 一次.

另外, 上頭抓取 apache 程式的作法, 是在 Debian Etch 下頭使用, 如果你的系統 apache 程式與執行者不一樣的話, 請自行修改上頭的內容才能正常使用.

接著, 我們就等著發生 Segmentation fault 時, 再來查看該 PID 的內容. 應該可以在檔案最後看到類似下面的內容:

setsockopt(42, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
rt_sigaction(SIGSEGV, {0x43ab80, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, {0x2b5951de9ca0, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
rt_sigaction(SIGFPE, {SIG_DFL}, {0x2b5951de9ca0, [FPE], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
rt_sigaction(SIGBUS, {0x43ab80, [BUS], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, {0x2b5951de9ca0, [BUS], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
rt_sigaction(SIGILL, {0x43ab80, [ILL], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, {0x2b5951de9ca0, [ILL], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
rt_sigaction(SIGABRT, {0x43ab80, [ABRT], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, {0x2b5951de9ca0, [ABRT], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
fstat(2, {st_mode=S_IFREG|0640, st_size=2396024, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b5959ea1000
kill(3204604, SIGSEGV) = 0
rt_sigreturn(0x30e5fc) = 12
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
chdir("/etc/apache2") = 0
rt_sigaction(SIGSEGV, {SIG_DFL}, {0x43ab80, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0
kill(3204604, SIGSEGV) = 0
rt_sigreturn(0x30e5fc) = 12
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
Process 3204604 detached 

然後再往前找找, 應該可以找到最後發生錯誤之前讀取的網頁,  再來查看實際發生的原因吧.  這樣子至少可以得知到底是在那個程式發生了問題.

在我的系統上頭, 發現問題是出現在幾個星期前安裝的一個 LifeType 1.2 的測試環境, 用來測試 \ 會消失的問題, 裡頭不知道怎麼回事, 在一堆 bot 的存取下, 會發生這個問題. 把這個網址的內容移除後, 原本平均每五分鐘就會發生一次 Segmentation fault 的情形, 在跑了一整天後, 都沒有再出現了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:Apache 出現 child pid XXXX exit signal Segmentation fault (11) 該如何處理? [ 回覆 ]

看到這篇文章,剛好我的apache也都會出現這樣的訊息,但產生出來的log,不知道是從哪兒看出來是哪兒產生了問題,不知是否可以指點一下呢??Thanks

迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 130 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS