【发布时间】:2017-10-24 22:26:50
【问题描述】:
我需要运行一个带有超时功能的命令,如果在x时间内没有执行,那么脚本将从头开始,否则它可以继续执行其他命令。我可以这样做吗?
我已经尝试过用例,但只要我使用一个,它就可以工作,如果使用两个案例,它会给我一个错误。有人知道如何超时吗?也许使用像 -s USR1 这样的用户定义信号,但我不知道如何设置它以及是否可以使用信号执行命令:/
【问题讨论】:
我需要运行一个带有超时功能的命令,如果在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 来启动 while loop,然后测试来自 timeout 的退出代码是否为 124。如果是 124,则循环重复。
:
命令: 是一个空操作。我们不需要while 循环体中的任何命令,我们使用这个命令。
done
这标志着while 循环的结束。
这假设 some_command 负责任地响应 TERM 信号。如果没有,退出代码将是 128+9 而不是 124。
来自man timeout:
如果命令超时,并且 --preserve-status 没有设置,那么 以状态 124 退出。否则,以 COMMAND 状态退出。 如果未指定信号,则在超时时发送 TERM 信号。这 TERM 信号会杀死任何不会阻塞或捕获它的进程 信号。可能需要使用 KILL (9) 信号,因为这 信号不能被捕获,在这种情况下 退出状态是 128+9 而不是 124。
【讨论】: