You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何选择性禁用特定可执行文件conftest的核心转储日志?

过滤conftest程序的核心转储与日志条目

问题背景

当前系统使用systemd收集核心转储,但部分软件的configure脚本会编译执行名为conftest的测试程序——这类程序会故意触发核心转储(如通过%n格式字符触发FORTIFY_SOURCE安全检查),以此判断系统特性。这类无意义的核心转储会在系统日志中生成不必要的严重级别条目,同时在/var/lib/systemd/coredump/堆积无效文件。我们需要实现:若可执行文件为conftest则丢弃核心转储,否则正常交由systemd-coredump处理。

当前系统核心转储配置

server ~ # cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h

server ~ # ulimit -c
unlimited

server ~ # cat /etc/systemd/coredump.conf 
[Coredump]
#Storage=external
#Compress=yes
# On 32-bit, the default is 1G instead of 32G.
#ProcessSizeMax=32G
#ExternalSizeMax=32G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

问题场景示例

configure脚本通过conftest触发核心转储的日志片段:

configure:12918: checking whether printf supports the 'n' directive
configure:12992: x86_64-pc-linux-gnu-gcc -o conftest -O2 -pipe -march=native  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs conftest.c  >&5
configure:12992: $? = 0
configure:12992: ./conftest
*** %n in writable segment detected ***
./configure: line 3126:  1354 Aborted                 (core dumped) ./conftest$ac_exeext
configure:12992: $? = 134
configure: program exited with status 134
configure: failed program was:
| /* confdefs.h */
| /* ... */
| static char fmtstring[10];
| static char buf[100];
| int main ()
| {
|   int count = -1;
| #ifdef _MSC_VER
|   _set_invalid_parameter_handler (invalid_parameter_handler);
| #endif
|   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
|      support %n in format strings in read-only memory but not in writable
|      memory.  */
|   strcpy(fmtstring, "%d %n");
|   if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
|       || strcmp (buf, "123 ") != 0
|       || count != 4)
|     return 1;
|   return 0;
| }
configure:13007: result: no

解决方案

通过自定义核心转储处理脚本,实现基于进程名的过滤逻辑:

1. 创建自定义过滤脚本

创建/usr/local/bin/coredump-filter.sh,内容如下:

#!/bin/bash

# 获取触发核心转储的进程可执行文件名
EXE_NAME=$(basename $(readlink /proc/$1/exe))

if [ "$EXE_NAME" = "conftest" ]; then
    # 丢弃conftest的核心转储
    cat > /dev/null
else
    # 其他进程正常交给systemd-coredump处理
    exec /usr/lib/systemd/systemd-coredump "$@"
fi

2. 赋予脚本执行权限

chmod +x /usr/local/bin/coredump-filter.sh

3. 修改核心转储模式配置

  • 临时生效(重启后失效):
echo "|/usr/local/bin/coredump-filter.sh %P %u %g %s %t %c %h" > /proc/sys/kernel/core_pattern
  • 永久生效(写入sysctl配置):
echo "kernel.core_pattern=|/usr/local/bin/coredump-filter.sh %P %u %g %s %t %c %h" >> /etc/sysctl.conf
sysctl -p

4. 验证效果

手动编译执行一个conftest程序触发核心转储,检查/var/lib/systemd/coredump/是否生成新文件,同时通过journalctl -xe查看系统日志,确认conftest的核心转储条目已被过滤,其他进程的核心转储仍正常收集。

内容的提问来源于stack exchange,提问作者user2690527

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:24:45