在bash中运行一个循环,在一行中超时

时间:2015-01-22 00:22:58

标签: timeout sh

我需要一个单行命令,它可以在一个超时的循环中执行某些操作。

这样的东西
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while true; do dd if=/tmp/nfsometer_trace/mnt/TESTFILE of=/dev/null bs=BLOCK_SIZE; done"

通过执行以下操作,将在'sh'中执行该命令:

echo $COMMAND > COMMAND_FILE
sh COMMAND_FILE

但是这给了我一个语法错误:

  

意外标记“do”

附近的语法错误

有没有办法让单行命令超时无限循环?

1 个答案:

答案 0 :(得分:2)

这样的命令
 while true ; do echo $(( i++ )) ; sleep 5 ; done

将产生类似

的输出
 0
 1
 2
 3

但是如果我尝试在超时时直接使用该命令,我会收到类似的错误消息,即

timeout 20 while true ; do echo $(( i++ )) ; sleep 5 ; done

 bash: syntax error near unexpected token do

某些程序(例如ssh)将处理长字符串的逻辑,如果引用,则参数只是一个字符串。

timeout 20 "while true ; do echo $(( i++ )) ; sleep 5 ; done"

timeout: failed to run command 'while true ; do ...' 

相同的错误消息我是否使用单个dbl-quotes传入字符串。

阅读info timeout我们看到了

 COMMAND must not be a special built-in utility (*note Special built in utilities::).

也许while循环有资格成为特殊的内置实用程序?

最后,请注意我已经删除了担心使用您拥有的“包装”信息,即。

export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while ....

导致您的问题。

当你遇到这样的问题时,最好向自己证明你的命令工作在一个更简单的情况下,然后让它在一个更复杂的用法中工作。

鉴于这些证据,我认为超时不是为了做你想做的事。

作为最后的手段,我建议您尝试将while循环转换为脚本并仅调用

 timeout 20 myLooperScript

IHTH