运行 bash 中的循环,单行超时

Run a loop in bash with timeout in a single line

我需要一个单行命令,在超时的情况下循环执行某些操作。

类似

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

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

syntax error near unexpected token `do'

有什么方法可以让单行命令使无限循环超时?

这样的命令
 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 ...' 

同样的错误消息,我是否使用单引号来传递字符串。

阅读 info timeout 我们看到

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

也许 while 循环符合特殊的内置实用程序?

最后,请注意,我已经消除了对使用您拥有的 "wrapper" 信息的担忧,即。

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

作为你的问题的原因。

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

鉴于此证据,我不认为超时旨在执行您想要的操作。

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

 timeout 20 myLooperScript

IHTH