Bash:如果另一个命令超时,有没有办法执行命令?

时间:2017-10-24 22:26:50

标签: bash timeout

我需要运行带有超时功能的命令,这样如果它在x时间内没有执行,那么脚本应该从头开始,否则它可以继续并执行其他命令。我能这样做吗?

我已经尝试过使用案例,但只要我使用一个案例就可以工作,如果使用两个案例就会给我一个错误。有没有人知道怎么做超时?也许使用像-s USR1这样的用户定义信号,但我不知道如何设置它,如果我可以用信号执行命令:/

1 个答案:

答案 0 :(得分:0)

如果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

    这将通过执行while loop并超时10秒来启动some_command,然后测试timeout的退出代码是否为124。如果是124,那么while循环重复。

  • :

    命令:是无操作。我们在while循环体内不需要任何命令,我们使用此命令。

  • done

    这标志着while循环结束。

特例:行为不端的命令

这假设some_command负责任地响应TERM信号。如果没有,退出代码将是128 + 9而不是124。

文档

来自man timeout

  

如果命令超时,并且未设置--preserve-status,则   以状态124退出。否则,退出状态为COMMAND。   如果未指定信号,则在超时时发送TERM信号。该   TERM信号会杀死任何不阻止或捕获该进程的进程   信号。由于这个原因,可能需要使用KILL(9)信号   在这种情况下,信号无法被捕获    退出状态是128 + 9而不是124。