从 2.2 升级到 2.4 时,mpm_itk 和 mpm_prefork 不知何故一起启用了。我之前的一个帖子中讨论过这个问题: Apache 错误日志中经常出现 mpm_itk 错误 这导致出现“mpm_itk 错误”,但现在我收到的是这些核心通知:[core:notice] [pid xxxxx] AH00052:子 pid 4597 退出信号分段错误(11)有人知道我应该看什么才能最终解决这个问题吗?
更新
我设法跟踪了一个进程直到其段错误,但无法真正解释它。任何帮助都将不胜感激:
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
getcwd("/", 4095) = 2
chdir("/website/public") = 0
lstat("/website/public/index.php", {st_mode=S_IFREG|0644, st_size=1777, ...}) = 0
lstat("/website/public", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/website", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0
fcntl(14, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1, len=1}) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f5a3d942028} ---
chdir("/etc/apache2") = 0
rt_sigaction(SIGSEGV, {SIG_DFL, [], SA_RESTORER|SA_INTERRUPT, 0x7f5a3cd258d0}, {SIG_DFL, [], SA_RESTORER|SA_RESETHAND, 0x7f5a3cd258d0}, 8) = 0
kill(24177, SIGSEGV) = 0
rt_sigreturn() = 140025556901856
--- SIGSEGV {si_signo=SIGSEGV, si_code=SI_USER, si_pid=24177, si_uid=33} ---
+++ killed by SIGSEGV +++
答案1
该strace
命令列出了应用程序运行时发出的系统调用。
如果您不是开发人员:系统手册第 2 部分记录了系统调用,可帮助您了解正在发生的事情。
fcntl(14, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1, len=1}) = 0
man 2 fcntl
姓名
fcntl
- 操作文件描述符
int fcntl(int fd, int cmd, ... /* arg */ );
描述
fcntl()
对打开的文件描述符 fd 执行下述操作之一。操作由 cmd 决定。
fcntl()
可以采用可选的第三个参数。此参数是否必需由 cmd 决定。所需的参数类型在每个 cmd 名称后的括号中指明(在大多数情况下,所需的类型是 int,我们使用名称 arg 来标识参数),如果不需要该参数,则指定 void。...
换句话说:尝试对文件描述符编号 14 进行读锁定。要找出存在哪个文件,应该使用编号 14 的符号链接,即 中表示文件的整数/proc/<PID>/fd/14
。
在我看来,这看起来与下一行的错误无关,但我不是开发人员......:
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f5a3d942028} ---
si_signo=SIGSEGV
看起来您正在监控的进程 id 收到了分段错误(SIGSEGV
) 信号是由于访问无效内存地址 0x7f5a3d942028 引起的,该地址不允许访问(SEGV_ACCERR si_code)。
至于为什么会发生这种情况:strace
通常不太可能为您提供帮助。