如何模拟管道失效?

时间:2013-10-01 10:14:44

标签: linux bash

我想模拟管道故障,所以我猜我需要一个陷阱才能在一秒左右后将其杀死?

#!/bin/bash

set -u
set -o pipefail

cat /dev/zero | cat | cat

但是如何实施这样的陷阱?

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

echo "a" | grep "b" | sed 's/a/c/g'
echo $?

set -o pipefail
echo "a" | grep "b" | sed 's/a/c/g'
echo $?

打印:

0
1

之间的grep返回1退出代码(失败),因此在设置pipefail后,整体退出代码为1。所以pipefail正在工作,因为它应该返回管道中任何命令的最后一个非零退出代码。

答案 1 :(得分:1)

  

但是如何实施这样的陷阱?

您似乎想知道trap sigspec 应该是什么。

  

如果启用pipefail,则管道的返回状态为值   最后(最右边)命令以非零状态退出,或者为零   如果所有命令都成功退出。

您想要捕获ERR

示例:

set -u
set -o pipefail

trap 'echo pipefail' ERR

false | true

答案 2 :(得分:0)

要模拟pipefail,管道中的某个进程应以非零值退出(正如您所知,这通常意味着某种失败)。 More about pipelines。 是的,向进程发送SIGKILL或SIGINT信号将导致退出代码高于零,at least on Linux it does so