如果没有退出代码0,如何超时部分shell脚本并重新运行它

时间:2015-09-17 10:04:12

标签: linux bash shell

我有一个shell脚本,第一行(#! /bin/sh之后):

IP=$(curl ifconfig.me)

有时脚本将在3秒内执行并在3秒内完成,此时它会在脚本中超时(我知道因为我使用notify-send在下一行显示IP)。

我经常需要多次运行脚本才能完成它(我使用CTRL + C来中断)。

我希望能够运行一次脚本,如果它在10秒内没有完成,它会退出并再次运行,并保持循环,直到它在10秒的时间范围内得到退出代码0,或者解决为什么它不仅仅是第一次完成的原因。

我已经看到许多其他解决方案可以暂停,但我没有看到任何对我有意义的指令,因此无法实现它们。例如this one

我正在考虑尝试使用ulimit版本,因为我现在比以前对python更有经验但是我不确定使用脚本来运行脚本是否有意义。

我尝试过使用睡眠,但我似乎只是让它暂停运行脚本,因此它永远不会完成。

脚本的其余部分为iptables设置规则。

3 个答案:

答案 0 :(得分:3)

您需要做的是定制您正在使用的curl命令。有许多选项可能会有所帮助:

curl --connect-timeout 3 --max-time 10 --retry 3 ifconfig.me

如果连接未在3秒内建立,则告知curl命令超时,如果完整数据传输超过10秒,它将超时,并且将重试3次。适当调整!

您可以设置一些其他参数,也可以检查人的卷曲。

答案 1 :(得分:1)

您应该使用curl --max-time选项。如果它在指定的秒数内没有完成,它将失败。

答案 2 :(得分:0)

您可以使用coreutils的timeout命令

while ! IP=$(timeout 3 curl ifconfig.me)
do
   sleep 1
done