如何在Bash中使用exit(0)设置超时

13

我正在尝试设置一个travis脚本,在其中运行我们的应用程序以确保它能够正常启动。如果可以,则可以通过构建。测试可以捕获启动时的错误。但是,它是一个API服务器,如果我运行二进制文件并且成功了,它将无限期地运行。

我尝试使用以下命令:

timeout --preserve-status 20s <binary>

但这只返回二进制文件的退出码,当从超时中终止时为143。

timeout 20s <binary>

这将在成功时返回退出127。

是否有一个脚本可以运行该二进制文件,如果二进制文件在启动时出错,则失败,并且如果在20秒后成功启动,则返回退出0以通过travis构建?


我认为我有一个解决方法。我可以在后台运行它,休眠20秒,然后使用curl GET测试它。如果服务器成功启动,则它将正常工作,否则它将返回非零退出。 - Mark
1
那听起来比你在这里提出的要好得多。 - that other guy
我完全同意。继续这个话题,但是这个答案是针对问题的完美答案。 - Mark
3个回答

15

如果您想:

  • 返回退出代码0

    • 如果命令成功完成(代码0)。
    • 或者,如果命令尚未完成(代码124),也可以。
  • 返回退出代码1

    • 如果命令在超时之前失败。

那么请尝试这个方法:

timeout 10m some_command || ( [[ $? -eq 124 ]] && \
echo "WARNING: Timeout reached, but that's OK" )

9

不需要使用sleep,您可以按以下方式更改命令以强制返回代码为0

(timeout 20s <binary>; exit 0) 

例子:

(timeout 2s '/bin/sleep' 100; exit 0) #subshell creation                                                                                        
echo $?
0

vs

timeout 2s '/bin/sleep' 100
echo $?
124

1
这个回答非常完美。然而,对于我的用例,我将坚持使用curl,因为如果它在窗口内启动失败,那么我就会捕获到启动失败。如果等待时间不足,curl也会捕获到这种情况。 - Mark
1
如果进程立即失败,比如使用 (timeout 2s '/bin/false'; exit 0),这也会返回 0。 - that other guy

0

最简单的方法是使用 || true

timeout 5s sleep 50
▶ echo $?
124

▶ timeout 5s sleep 50 || trueecho $?
0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接