Linux 堆芯转储到管道失败

Linux 堆芯转储到管道失败,linux,pipe,mips,core,dump,Linux,Pipe,Mips,Core,Dump,在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 he

在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
i、 e.管道到程序不起作用。如果我指定了一个文件:

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

然后它就起作用了。我错过了什么?

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

解决方法如下:
感谢和

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

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

仅仅用脚本包装对我来说不起作用,我还必须在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"


稍微改进了Eric的回答:

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

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

您的解决方案是正确的,但不是因为您提到的原因。看这里:这就是确切的原因
>
是一种shell语言,用于将标准输出重定向到文件,在尝试执行core_模式中提到的程序时,内核不会解释该文件。(这在交互式shell或shell脚本中工作)答案应该包含足够的信息来解决问题,即使链接中断也有效。请参阅我同意
|/bin/bash-c
,但不同意将命令结构化为不必要地使用
eval
。考虑<代码> BASH-C“$@”>“0美元”/tMe/Calp。%E.%P.%G.GZIP < /代码>——这样就不需要<代码> EVA/EXCOR>及其相关的风险。BTW,“应该是可接受的答案”可能不是好的形式——这是OP决定的,就像UpDope/Dop选票是整个社区的结果一样。指出一种方法的优点是完全合法的;对这些优势做出价值判断是没有道理的。
sysctl -w kernel.core_pattern='|/bin/sh -c $@ -- eval exec gzip --fast > /var/crash/core-%e.%p.gz'