Como canalizar o Coredump para um aplicativo personalizado?

1

Eu escrevi uma aplicação C simples (em core_app.c) para processar um 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;
}

e depois eu defino o core_pattern usando um serviço systemd que contém:

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

Depois de redefinir, o conteúdo do arquivo /proc/sys/kernel/core_pattern está correto. Mas o syslog mostra:

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

Alguém sabe porque o cano falhou? Obrigado

    
por why2 30.06.2017 / 14:51

1 resposta

1

O kernel invoca o comando declarado em core_pattern do diretório atual do processo. Esta é uma invocação direta do kernel, portanto, não há pesquisa PATH. Portanto, core_app deve ser um arquivo executável no diretório atual do processo.

Para invocar um determinado executável core_app , independentemente do diretório atual do processo, use o caminho completo para core_app , por exemplo,

echo '|/usr/local/sbin/core_app' >/proc/sys/kernel/core_pattern
    
por 01.07.2017 / 01:19