管道故障的奇怪案例

时间:2017-07-19 16:04:12

标签: linux bash pipe ldd

任何人都可以向我提供有关以下问题的可能原因的任何见解。大多数情况下,我可以运行( set -o pipefail; ldd --version | head -n 1; echo $? )并获得以下内容。

$ ( set -o pipefail; ldd --version | head -n 1; echo $? ) 
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
0

然后随机它将开始失败

$ ( set -o pipefail; ldd --version | head -n 1; echo $? ) 
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
141

我在Ubuntu 16.04 x86_64以及RHEL 7.3 ppc64le机器上看到了它的价值

1 个答案:

答案 0 :(得分:1)

141EINIT。即过程中断了。

发生的是head -1在读取第一行后关闭其输入流。当ldd尝试写入已关闭的管道时,它会以EINIT失败。

通常情况下,您看不到这一点 - 程序在head取得所需内容后退出并出现错误,但您没有看到错误结果。但是因为你set -o pipefail,你会看到错误。

这是间歇性的,因为管道中有缓冲区,并且调度是不可预测的。有时lddhead关闭管道之前完成了写作。

如果你ldd | echo(因为echo立即关闭stdin),你可以始终看到失败,并且你可以始终看到它在ldd | cat成功(因为cat总是消耗直到EOF)