1.sysctl -a|grep core
kernel.core_uses_pid = 1
kernel.core_pattern = core
kernel.core_pipe_limit = 0
2.ulimit -c
1
ulimit -c unlimited
3.modify /etc/sysctl.conf
kernel.core_pattern = %%%p-%u-%g-%s-%t-%h-%e-%c.core
core file is :
%6619-0-0-11-1370293406-linux-4-a.out-18446744073709551615.core
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名
4.kernel.core_uses_pid = 1
core file is :
core.6617
5.core文件太大,影响系统运行,可定位到/usr/tmp目录下
kernel.core_pattern = /usr/tmp/%%p-%u-%g-%s-%t-%h-%e-%c.core
进一步可以压缩
kernel.core_pattern= | usr/local/sbin/core_helper %t %e %p %c
kernel.core_uses_pid= 0
$sysctl-p
core_helper:
#!/bin/sh
execgzip ->/var/core/$1-$2-$3-$4.core.gz
在suse下的脚本为:
exec gzip -c >/var/core/$1-$2-$3-$4.core.gz
管道符在2.6才支持
5. suid权限的程序的转储
kernel.suid_dumpable = 0
fs.suid_dumpable = 1
6.利用内核转储掩码排除共享内存
多个进程使用同一个共享内存,共享内存达到几个G,会生成很大的文件,对磁盘和系统都有影响,转储过程中会导致系统咱书停止服务。
设置方法, /proc/<PID>/coredump_filter
bit 0 匿名专用内存
bit1 匿名共享专用内存
bit2 file-backed专用内存
bit3 file-backed共享内存
bit4 ELF文件映射 (2.6.24后可用)
example:
cat /proc/16278/coredump_filter
00000033
echo 1 > coredump_filter
cat coredump_filter
00000001
7.启用整个系统的转储
1)在/etc/initscript中加入
ulimit -S -c 0 >/dev/null 2>&1 //禁用
ulimit -S -c 0 >/dev/null 2>&1 //开启
/etc/sysconfig/init
DAEMON_COREFILE_LIMIT='ulimited'
2)直接修改/etc/security/limits.conf
3)在/etc/sysctl.conf加入
fs,syud_dumpable=1
使SUID的程序也能生成core。