我需要运行一个带有超时功能的命令,这样如果在x时间内没有执行,那么脚本应该从头开始,否则它可以继续执行其他命令。我能做到吗?
我已经尝试过用例,但只要我使用一个,它就可以工作,如果使用两个用例,它就会给我一个错误。有人知道如何暂停吗?也许使用用户定义的信号,比如-s USR1,但我不知道如何设置,也不知道是否可以用信号执行命令:/
如果some_command
在10秒内完成,则将继续执行脚本的其余部分。如果some_command
超时,则重复,直到它没有超时:
while timeout 10 some_command; [ $? -eq 124 ]
do
:
done
echo "Continuing on with script"
它的工作原理
如果命令超时,则默认情况下,timeout
退出并返回代码124。我们可以使用它来测试命令是否超时,从而测试是否需要重复。更详细地说:
while timeout 10 some_command; [ $? -eq 124 ]; do
这通过在10秒超时的情况下执行
some_command
,然后测试来自timeout
的退出代码是否为124来启动while loop
。如果是124,则while循环重复。:
命令
:
是no-op。在while
循环的主体中我们不需要任何命令,我们使用这个命令。done
这标志着
while
循环的结束。
特殊情况:行为不端的命令
这假设some_command对TERM信号作出负责任的响应。如果没有,退出代码将是128+9,而不是124。
文件
来自man timeout
:
如果命令超时,并且未设置--preserve状态,则以状态124退出。否则,以COMMAND状态退出。如果未指定任何信号,则在超时时发送TERM信号。这个TERM信号杀死任何未阻止或捕获的进程信号可能需要使用KILL(9)信号,因为信号无法捕捉,在这种情况下退出状态是128+9而不是124。