【问题标题】:Core dump to a pipe is failing核心转储到管道失败
【发布时间】:2012-12-30 12:38:08
【问题描述】:

在 MIPS 平台上试过这个:

> uname -a
Linux (none) 2.6.29 #2 Mon Jan 14 13:26:04 PST 2013 mips GNU/Linux
> ulimit -c unlimited
> which gzip
/bin/gzip
> echo "|/bin/gzip - > /home/core-%t-%s-%e.gz" > /proc/sys/kernel/core_pattern
> ./fault
hello there
Segmentation fault (core dumped)
> ls /home/core*.gz
ls: /home/core*: No such file or directory

即管道到程序不起作用。如果我指定一个文件:

> echo "/home/core-%t-%s-%e" > /proc/sys/kernel/core_pattern

然后就可以了。我错过了什么?

【问题讨论】:

    标签: linux pipe mips core dump


    【解决方案1】:

    也许它失败是因为内核没有运行任何 shell,而是尝试执行一个程序。 尝试将 gzip 调用与重定向包装在一个脚本中并使用该脚本。

    【讨论】:

    • 您的解决方案是正确的,但不是因为您提到的原因。见这里:linuxquestions.org/questions/…
    • 这就是确切的原因。 > 是用于将标准输出重定向到文件的 shell 语言,当尝试执行 core_pattern 中提到的程序时,内核不会解释该文件。 (这在交互式 shell 或 shell 脚本中工作)
    【解决方案2】:

    【讨论】:

    【解决方案3】:

    这对我有用,应该是公认的答案。不是每个人都有能力包装在单独的脚本中。

    echo "|/bin/bash -c \"\$@\" -- eval gzip > /tme/core.%E.%p.%t.gz" > /proc/sys/kernel/core_pattern
    

    【讨论】:

    • 我同意|/bin/bash -c,但不同意构建命令以不必要地使用eval。考虑bash -c '"$@" > "$0"' /tme/core.%E.%p.%t.gz gzip -- 这样就不需要eval 及其相关风险。
    • 顺便说一句,“应该是公认的答案”可能不是好的形式——这是由 OP 决定的,就像赞成/反对票取决于整个社区一样。指出一种方法的优点是完全合法的;无缘无故对这些优势做出价值判断。
    【解决方案4】:

    仅仅包含在脚本中对我来说不起作用,我还必须在 core.sh 中指定适当的 shell 环境

    root@fredy:/data/cores# cat /usr/local/sbin/core.sh
    #!/bin/sh
    exec /usr/bin/pigz -f - >"/data/cores/core-$1-$2-$3-$4-$5.gz"
    

    root@fredy:/data/cores# cat /proc/sys/kernel/core_pattern
    |/usr/local/sbin/core.sh %e %p %h %s %t
    

    【讨论】:

      【解决方案5】:

      稍微改进了 Eric 的回答:

      sysctl -w kernel.core_pattern='|/bin/sh -c $@ -- eval exec gzip --fast > /var/crash/core-%e.%p.gz'
      

      确实不需要将 shell 保存为单独的文件。在 CentOS-7.7 上检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2017-03-07
        • 1970-01-01
        相关资源
        最近更新 更多