如何在 Bash 中运行命令直到成功或超时?
错误概述
在运行 Bash 命令时,有时我们需要确保该命令在成功执行之前不断尝试,或者设置一个超时时间。如果命令在超时之前仍未成功执行,程序应该停止尝试并返回错误信息。本文将讨论如何使用 Bash 脚本来实现此功能,即“如何运行一个 bash 命令直到它成功或超时”。
常见原因
- 网络连接问题:在执行需要网络连接的命令时,如果网络不稳定,可能导致命令失败。
- 资源未准备就绪:某些命令可能依赖于特定的系统资源或服务,在资源未准备好之前执行会导致失败。
- 命令参数错误:如果命令的参数不正确,可能导致命令无法成功执行。
- 权限问题:在某些情况下,执行命令的用户可能没有足够的权限来执行该命令。
解决方法
方法 1: 使用 until 循环和 sleep
这种方法使用 until 循环来不断尝试执行命令,并在每次失败后等待一段时间。
NEXT_WAIT_TIME=0
until (( NEXT_WAIT_TIME == 5 )) || command; do
sleep "$(( NEXT_WAIT_TIME++ ))"
done
- 解释:
NEXT_WAIT_TIME=0:初始化等待时间为0。until (( NEXT_WAIT_TIME == 5 )) || command:当NEXT_WAIT_TIME达到5次或者命令成功时,退出循环。sleep "$(( NEXT_WAIT_TIME++ ))":每次命令失败后,暂停一段时间,时间逐次增加。
方法 2: 使用 timeout 命令
如果你想设置一个明确的超时,可以使用 timeout 命令。
timeout 12h bash -c 'until ssh root@mynewvm; do sleep 10; done'
- 解释:
timeout 12h:设置超时为12小时。bash -c 'until ssh root@mynewvm; do sleep 10; done':尝试连接到远程服务器,如果失败则每10秒重试一次。
方法 3: 自定义重试函数
可以定义一个通用的重试函数来执行给定的命令,直到成功或达到最大尝试次数。
“`bash
!/bin/bash
retry()

コメント