如何选择性禁用特定可执行文件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
相关产品推荐
相关产品推荐

