为什么`timeout'不适用于管道?

时间:2012-08-13 22:14:50

标签: bash timeout pipe

timeout的以下命令行调用(由于测试原因没有意义)不能按预期工作。它会等待10秒钟,并且在3秒后不会停止命令。为什么?

timeout 3 ls | sleep 10

4 个答案:

答案 0 :(得分:11)

您的命令正在运行timeout 3 ls并将其输出汇总到sleep 10。因此,sleep命令不受timeout的控制,并且将始终睡眠10秒。

这样的事情会产生预期的效果。

timeout 3 bash -c "ls | sleep 10"

答案 1 :(得分:3)

'ls'命令不应该花3秒钟运行。我认为正在发生的事情是你说(1)3秒后ls超时(再次发生这种情况不会发生,因为ls不应该花费3秒左右的时间来运行),然后(2)将结果输入睡眠10不需要进一步的参数而不是你给它的数字。因此ls发生,超时无关紧要,bash睡了10秒钟。

答案 2 :(得分:1)

我知道如何获得效果的唯一方法是将管道命令放入单独的文件中:

cat > script
ls | sleep 10
^D

timeout 3 sh script

答案 3 :(得分:0)

在管道的 last 命令上设置超时就足够了:

# Exits after 3 seconds with code 124
ls | timeout 3 sleep 10

# Exits after 1 second with code 0
ls | timeout 3 sleep 1