从debian lenny升级到squeeze(apache2 2.2.16-6+squeeze4和php 5.3.10-1~dotdeb.1)后,我的apache进程开始因分段错误而退出。它每 5-30 分钟发生一次(对于 1 个进程),因此现在不会产生任何影响。问题是,有时SIGSEGV
他们不是用 退出,而是疯狂地循环,系统 cpu 使用率SIGBUS
错误为 100%:
# strace -p27635 进程 27635 附加 - 中断退出 --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) ---
他们不回应kill -9
。但是当我在杀死进程后运行 strace 时,它只是重复SIGBUS
两次然后退出。
# strace -p27635 进程 27635 附加 - 中断退出 --- SIGBUS(总线错误)@ 0 (0) --- --- SIGBUS(总线错误)@ 0 (0) --- +++ 被 SIGKILL 杀死 +++
为什么没有 strace 就无法杀死该进程?运行 strace 如何影响它可以退出的进程?
(我知道我的 apache/php 模块设置可能有问题,但在这个问题中,我对不可杀死进程的奇怪行为感兴趣。如果我无法修复 apache/php,我会问另一个问题。 )
答案1
首先,检查你的内存。
不响应 SIGKILL 的进程是内核错误或硬件错误的症状。如果您不只是更改内核,最有可能的原因是您的 RAM 出现故障,因此请检查它。内核错误可能有微妙的原因(例如使用错误版本的 gcc)并以微妙的方式表现出来(例如工作正常但 X 服务器无法启动 — 同样的真实故事)。如果您使用的是许多其他用户正在使用的发行版提供的内核,那么您的新内核不太可能有错误,但它可能会发生 - 可能是由驱动程序和活动模式的组合触发的罕见错误。尝试另一个内核。
Apache 中也可能存在导致其崩溃的错误,但如果 SIGKILL 不起作用,那不是 Apache 的错。