以下命令行调用timeout
(没有任何意义,仅出于测试原因)无法按预期工作。它等待 10 秒,并且在 3 秒后不会停止命令的工作。为什么 ?
timeout 3 ls | sleep 10
您的命令正在执行的操作是将timeout 3 ls
其输出通过管道传输到sleep 10
. 因此,该sleep
命令不受控制,timeout
并且将始终休眠 10 秒。
像这样的东西会产生预期的效果。
timeout 3 bash -c "ls | sleep 10"
'ls' 命令不应该花费 3 秒来运行。我认为正在发生的事情是你说(1) ls 3 秒后超时(这再次没有发生,因为 ls 不应该花费任何接近 3 秒的时间来运行),然后(2)将结果输入到 sleep 10 中不需要比你给它的数字更多的参数。因此 ls 发生,超时无关紧要,并且 bash 休眠 10 秒。
我知道如何获得您想要的效果的唯一方法是将管道命令放入一个单独的文件中:
cat > script
ls | sleep 10
^D
timeout 3 sh script
在管道的最后一个命令上设置超时就足够了:
# Exits after 3 seconds with code 124
ls | timeout 3 sleep 10
# Exits after 1 second with code 0
ls | timeout 3 sleep 1