sysctl
/proc/sys/kernel/下有关于core文件的sysctl文件。下面针对这些进行介绍。
/proc/sys/kernel/core_pattern
使用core_pattern可以设置核心转储文件的命名规则。在Fedora 12中默认为core。在RHEL6中默认的是下列内容,实际上这也是core。
cat/proc/sys/kernel/core_pattern
|/usr/libexec/abrt-hook-ccpp/var/spool/abrt%p%s%u%c
当第一个字符为|时,将执行在其后指定的进程(这个进程成为core_pattern进程)。/usr/libexec/abrt-hook-ccpp是生成自动bug报告工具(ABRT)文件的命令。
默认的文件名最后有.<PID>(参考后面介绍的core_uses_pid)。在core的情况下为core.<PID>。
更改core_pattern,可以设置为core以外的文件名。如表7-16所示,除了字符串以外,core_pattern还可以指定以%开始的模式(pattern)。
指定%p时,文件名的最后不加.<PID>。下面是更改core_pattern时的例子。
echo"coredump-%p-%s-%h-%e">/proc/sys/kernel/core_pattern
ulimit-c unlimited
sleep 1000&kill-11$!
[1]2968
[1]+段错误(核心转储)sleep 1000
ls
coredump-2968-11-localhost.localdomain-bash
/proc/sys/kernel/core_pipe_limit
core_pipe_limit是限制收集核心转储的进程同时执行的sysctl参数次数。在RHEL6中由abrt工具包将默认值设置为4。
当/proc/sys/kernel/core_pattern的第一个字符为|时,core_pattern进程会获取核心文件,但此时内核会停止崩溃进程译[1]。这是为了获取/proc/<崩溃进程的PID>/的数据。
内核等待core_pattern进程结束后,删除崩溃进程。但是,当core_pattern进程存在bug时,核心转储处理可能不会结束。不断崩溃的进程都会由于这个有bug的core_pattern进程而被迫停止。
要让数量超过core_pipe_limit的值的进程同时生成core文件时,会放弃生成core文件,输出下列信息。
Pid 9322(stress)over core_pipe_limit
Jan 12 19:30:46 localhost kernel:Skipping core dump
/proc/sys/kernel/core_uses_pid
将core_uses_pid设置为1,core文件的最后就会自动添加.<PID>。设置为0时则不添加。RHEL6中默认为1。
[1]崩溃进程对应的英文是crash process。