捕获特定错误并重新尝试脚本? - BASH

时间:2016-05-23 14:01:56

标签: bash

我有一个bash脚本,它运行一个程序来迁移一些数据。大约30%到40%的时间都会失败。

我希望有一种方法可以在出现此特定错误时重试脚本,但我只想在失败前尝试3次。

脚本失败时输出以下内容:

Error: The connection to the remote server has timed out, no changes      have been committed. (#134 - scope: ajax_verify_connection_to_remote_site)

编辑:更具体......

migration.sh:
#!/bin/bash
various other scripts........
sudo a_broken_migration_program <Variables>

我想多次重试broken_migration,理想情况下只有在遇到此特定错误时才会失败但是如果这太复杂了我将会重新尝试重试所有错误。

1 个答案:

答案 0 :(得分:2)

要执行此操作,只需在循环中运行命令:

#Loop until counter is 3
counter=1
while [[ $counter -le 3 ]] ; do
        yourcommand && break
        ((counter++))
done

如果yourcommand成功,那么它将打破循环。如果它不成功,那么它将增加计数器和循环。直到柜台是3。

如果您只想重试特定的错误代码,可以在失败时捕获错误,测试代码并增加:

#Loop until counter is 3
counter=1
while [[ $counter -le 3 ]]
do
        #command to run
        ssh person@compthatdoesntexist 

        rc=$?
        [[ $rc -eq 255 ]] && ((counter++)) || break
done

此示例尝试ssh到一个不存在的框。然后,我们在变量$?中捕获返回码$rc。如果$rc255(&#34; ssh:无法解析主机名compthatdoesntexist:名称或服务未知&#34;)则会递增计数器并循环。任何其他退出代码都会让我们退出循环。