如何通过管道将 Coredump 传输到自定义应用程序?

如何通过管道将 Coredump 传输到自定义应用程序?

我编写了一个简单的 C 应用程序(在 core_app.c 中)来处理 coredump:

int main(int argc, char *argv[]) {
    FILE *fp = fopen("/tmp/coretest", "w");
    char input[MAX_INPUT];
    // write a coredump to /tmp/coretest
    if (fp != 0) {
        while (fgets(input, MAX_INPUT, stdin)) {
            fputs(input, fp);
        }
        fclose(fp);
    } else {
        perror("[FMon] cannot open file!");
    }

    return EXIT_SUCCESS;
}

然后我使用 systemd 服务设置 core_pattern,其中包含:

[Service]
ExecStart=/bin/sh -c "echo '| core_app' > /proc/sys/kernel/core_pattern"

重置后文件内容/proc/sys/kernel/core_pattern正确。但系统日志显示:

Jan 01 00:19:52 kernel: Core dump to | core_app pipe failed

有谁知道水管失败的原因吗?谢谢

答案1

内核core_pattern从进程的当前目录调用声明的命令。这是直接内核调用,因此没有 PATH 查找。因此core_app必须是进程当前目录中的可执行文件。

要调用特定的core_app可执行文件,无论进程的当前目录是什么,请使用 的完整路径core_app,例如

echo '|/usr/local/sbin/core_app' >/proc/sys/kernel/core_pattern

相关内容