Coredumpをカスタムアプリケーションにパイプする方法は?

Coredumpをカスタムアプリケーションにパイプする方法は?

コアダンプを処理するために、単純なCアプリケーション(core_app.c)を作成しました。

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

関連情報