core

1. 打开core开关

1.1 控制台方式(当前console有效)

1
2
3
ulimit -c 0 # 不产生core
ulimit -c 1024 # 限制core大小1024k
ulimit -c unlimited # 不限制core大小

1.2 配置方式

1
2
3
vim /etc/security/limits.conf
去掉soft core 0注释,并将0改为unlimited
soft core 0

2. 修改core命名规则或生成路径

2.1 默认下core在当前目录下,并且命名为core.pid;

2.2 临时修改:

可以直接修改/proc/sys/kernel/core_pattern文件的内容。例如,使用命令echo '/var/log/%e.core.%p' > /proc/sys/kernel/core_pattern,就可以将core dump文件的生成路径设置为/var/log/目录,文件名设置为进程名和进程ID。需要注意的是,/proc目录是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。

2.3 永久修改

如果想要永久修改core dump文件的生成路径和命名规则,可以通过修改/etc/sysctl.conf文件来实现。在/etc/sysctl.conf文件中,添加一行kernel.core_pattern = /var/log/%e.core.%p,然后保存退出。最后,使用命令sysctl -p使修改生效。

1
kernel.core_pattern= /var/log/%e.core.%p

2.4 core_pattern的格式可以包含以下一些元素:

  • %p:转储过程的PID
  • %u:转储进程的实际UID
  • %g:转储过程的实际GID
  • %s:引起转储的信号数
  • %t:转储时间,表示为自1970年1月1日00:00:00 +0000(UTC)以来的秒数
  • %h:主机名(与uname(2)返回的节点名相同)
  • %e:可执行文件名(无路径前缀)
  • %E:可执行文件的路径名,用斜杠(’/’)替换为感叹号(’! ’)
  • %c:崩溃过程的核心文件大小软资源限制(自Linux 2.6.24开始)

3. 生效

重启或这sysclt -p立即生效

4. 设置core_pattern建议

  1. 设置core文件的存放路径和文件名模式:你可以通过设置/proc/sys/kernel/core_pattern来指定core文件的存放路径和文件名模式。例如,你可以使用命令echo "/var/log/core-%e-%p-%t" > /proc/sys/kernel/core_pattern,这样当程序崩溃产生core dump时,会直接以这种格式存入到/var/log/目录下。
  2. 使用进程ID和时间戳:在文件名模式中,建议至少包含%p(进程ID)和%t(时间戳),这样可以帮助你更好地区分不同的core dump文件。
  3. 使用可执行文件名:如果你的系统中运行了多个程序,那么在文件名模式中包含%e(可执行文件名)可能会很有帮助,这样你可以知道是哪个程序产生了core dump。
  4. 使用管道符号:如果你希望在生成core dump文件的同时进行一些其他操作(例如压缩或发送通知),你可以在core_pattern的开头添加管道符号|,然后指定一个脚本,core dump将会以标准输入的形式传给这个脚本。
  5. 设置core文件的最大值:默认情况下,core文件的大小可能会受到限制。你可以使用ulimit -c unlimited命令来取消这个限制,或者设置一个适合你的系统的大小。