我有一个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,理想情况下,只有当它因这个特定错误而失败时,但如果这太复杂,我将决定重试所有错误。
为此,只需循环运行您的命令:
#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
中捕获返回代码$?
。如果$rc
255
("ssh:无法解析主机名组合不存在:名称或服务未知"),则它会递增计数器并循环。任何其他退出代码都会将我们踢出循环。