apport
默认的 core_pattern
ubuntu 22 的 core pattern 默认如下:
1
2
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
日志文件
在默认配置下,如果进程产生崩溃,那么生成的日志会在 /var/log/apport* 的文件里面。
比如:
1
2
/var/log/apport.log
/var/log/apport.log.*.gz
内存转储
如果生成了 core 文件,那么 core 文件位于 /var/crash 目录下。 我们可以使用 apport-unpack 工具解压这个文件,然后就可以用查看该文件的内容。 甚至可以用 gdb 调试了。
比如:
1
2
mkdir /root/coredump,
apport-unpack /var/crash/_usr_bin_nginx.0.crash /root/coredump,
解压后得到这样的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ls /root/coredump
/root/coredump/
/root/coredump/ProcMaps
/root/coredump/CoreDump
/root/coredump/ExecutableTimestamp
/root/coredump/ProblemType
/root/coredump/ProcEnviron
/root/coredump/CrashCounter
/root/coredump/Architecture
/root/coredump/ProcStatus
/root/coredump/Date
/root/coredump/ExecutablePath
/root/coredump/Uname
/root/coredump/UserGroups
/root/coredump/DistroRelease
/root/coredump/ProcCmdline
/root/coredump/ProcCwd
/root/coredump/Signal
apport 服务
如果不想让 apport 管理 crash,那么应该停止该服务
1
2
systemctl stop apport
systemctl disable apport
修改 core_pattern
查看当前的 kernel.core_pattern 参数值:
1
sysctl kernel.core_pattern
这将显示当前的 kernel.core_pattern 参数值。
临时更改 kernel.core_pattern 参数值:
1
sudo sysctl -w kernel.core_pattern=<new_pattern>
将
永久更改 kernel.core_pattern 参数值:
在文件 /etc/sysctl.conf 的末尾添加或修改以下行:
1
echo kernel.core_pattern = <new_pattern> | sudo tee /etc/sysctl.conf
1
sudo sysctl -p
这将使更改生效并永久保存在系统中。
注意,系统可能会有其它的服务修改 kernel.core_pattern, 因此禁用这些服务器。比如 ubuntu 的 apport。
kernel.core_pattern 占位符说明
在 kernel.core_pattern 参数中,可以使用一些占位符来定义生成 core dump 文件时的文件名模板。这些占位符会被内核替换为相应的值。以下是一些常用的占位符及其意义:
%p:进程 ID(PID)。 %u:实际用户 ID(UID)。 %g:实际组 ID(GID)。 %s:信号编号,导致 core dump 的信号。 %t:时间戳,表示生成 core dump 的时间。 %h:主机名。 %e:可执行文件的名称。 %E:可执行文件的路径。 使用这些占位符可以方便地在生成的 core dump 文件名中包含相关的信息,以便更好地标识和组织这些文件。
例如,如果 kernel.core_pattern 参数设置为 /var/core/core.%e.%p.%t,那么生成的 core dump 文件将会以以下格式命名:
1
core.<可执行文件名>.<进程 ID>.<时间戳>
这样的命名模板可以使生成的 core dump 文件具有清晰的标识,并且可以根据特定的信息进行过滤和处理。
注意:不同的操作系统和内核版本可能支持不同的占位符,具体的支持情况可以参考 Linux 内核文档或相关文档资源。
systemctl 设置 core 文件大小
如果要临时生效,那么可以使用下面的命令行
1
ulimit -c unlimited
在 systemd 配置文件中修改
首先切换编辑器为熟悉的 vim
1
export SYSTEMD_EDITOR="/usr/bin/vim"
打开服务配置文件
1
sudo -E systemctl edit <service-name>
将
在打开的编辑器中,添加以下内容来指定核心文件大小的限制:
1
2
[Service]
LimitCORE=<size>
将
例如,要将 OpenResty 核心文件大小限制为 100 兆字节,可以添加以下行:
1
2
[Service]
LimitCORE=100M
保存并关闭文件,可以看到编辑器提示新增内容保存在 /etc/systemd/system/openresty.service.d/override.conf。
重新加载 systemd 配置:
1
sudo systemctl daemon-reload
重新启动相应的服务以应用新的核心文件大小限制:
1
sudo systemctl restart <service-name>
将
通过上述步骤,你可以在 systemd 服务配置文件中指定特定服务的核心文件大小限制。请注意,该限制可能会受到系统配置和安全策略的限制
为什么不生成 coredump
- /proc/sys/kernel/core_pattern 配置没有修改
- 进程没有目标目录的写入权限 (master/worker 这种模式要求 master/worker 都有写权限)
- CORE 大小被限制为 0