【问题标题】:Why does `timeout` not work with pipes?为什么“超时”不适用于管道?
【发布时间】:2012-08-10 04:50:38
【问题描述】:

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

timeout 3 ls | sleep 10

【问题讨论】:

  • 您到底期待什么?
  • @FrankieTheKneeMan 我预期,timeout 执行 ls | sleep 10。由于ls | sleep 10 至少需要10 秒,timeout 应该停止它。但timeout 没有。

标签: bash timeout pipe


【解决方案1】:

“ls”命令不应花费 3 秒的时间来运行。我认为正在发生的事情是你说(1) ls 3 秒后超时(这再次没有发生,因为 ls 不应该花费任何接近 3 秒的时间来运行),然后(2)将结果输入到 sleep 10 中不需要比你给它的数字更多的参数。因此 ls 发生,超时无关紧要,bash 休眠 10 秒。

【讨论】:

  • ls 在包含大量文件的目录中运行可能需要很长时间。
  • 当然,你是对的。我做了一些我不应该在那个答案中做出的假设,谢谢你的洞察力。
【解决方案2】:

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

cat > script
ls | sleep 10
^D

timeout 3 sh script

【讨论】:

  • 您可以使用进程替换来内联并避免临时文件 -- timeout 3 sh <(echo "ls | sleep 10")
【解决方案3】:

您的命令正在运行timeout 3 ls 并将其输出通过管道传输到sleep 10。因此sleep 命令不受timeout 的控制,并且会一直休眠10s。

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

timeout 3 bash -c "ls | sleep 10"

【讨论】:

  • 现在我可以看到我的错误了。很好的解决方法。非常感谢你(再次),你真的帮了我很多。
  • 不是问题,约翰。很高兴我能帮忙:)
  • 在流上使用 grep 似乎还不够:tail -f file | timeout 20s bash -c 'grep "a" | sort | uniq' 什么也不打印..
【解决方案4】:

在管道的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

【讨论】:

  • “持续时间为 0 会禁用关联的超时。请注意,实际超时持续时间取决于系统条件,在指定亚秒级超时时应特别考虑这一点。”退出状态:* 124 如果 COMMAND 超时 * 125 如果 'timeout' 本身失败 * 126 如果 COMMAND 找到但无法调用 * 127 如果 COMMAND 找不到 * 137 如果 COMMAND 被发送 KILL(9) 信号 (128+9 ) * 否则 COMMAND 的退出状态
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多