Bash 脚本修复:网站连续不可用时重试逻辑优化
Bash 脚本修复:网站连续不可用时重试逻辑优化
在第二个循环中,如果出现连续失败的情况,应该直接跳出循环并执行重试逻辑,而不是继续循环其他网站。因此,在第10行添加一个标记变量 $all_websites_up,如果出现连续失败,则将其设置为 false,并在跳出循环后进行重试逻辑。同时,在第29行的判断条件中,应该使用 $all_websites_up 而不是 $failure_count。修改后的代码如下:
#!/bin/bash
# 定义需要检查的网站
websites=('www.google.com' 'www.facebook.com' 'www.twitter.com')
# 定义重试次数
max_retry=5
# 定义连续失败次数达到多少次后重新启动服务器
max_failures=3
# 定义日志文件
log_file="/var/log/tcping.log"
# 定义函数,用于使用 tcping 测试网站是否可用
function test_website {
echo "$(date) - 正在测试网站: $1"
for ((i=1; i<=$max_retry; i++)); do
tcping_result=$(hping3 -S $1 -c 1 -p 443 > /dev/null 2>&1)
if [ $? -eq 0 ]; then
echo "$(date) - 网站 $1 可用"
return 0
else
echo "$(date) - 网站 $1 不可用 - 第 $i 次重试"
fi
done
return 1
}
# 定义函数,用于重新启动服务器
function reboot_server {
echo "$(date) - 所有网站都不可用 - 正在重新启动服务器"
# 如果需要真正重启服务器,请取消下面一行的注释
# reboot
}
# 主循环
while true; do
failure_count=0
for website in "${websites[@]}"; do
if test_website "$website"; then
failure_count=0
else
((failure_count++))
if [ $failure_count -ge $max_failures ]; then
echo "$(date) - $website 连续 $failure_count 次不可用"
all_websites_up=false
break
fi
fi
done
if [ $failure_count -ge $max_failures ]; then
failure_count=0
for ((i=1; i<=$max_retry; i++)); do
echo "$(date) - 正在尝试重新测试所有网站 - 第 $i 次"
all_websites_up=true
for website in "${websites[@]}"; do
if ! test_website "$website"; then
all_websites_up=false
break
fi
done
if $all_websites_up; then
echo "$(date) - 重试第 $i 次后,所有网站都可用"
break
fi
echo "$(date) - 第 $i 次重试失败"
done
if ! $all_websites_up; then
reboot_server >> $log_file 2>&1
exit 0
fi
fi
sleep 5
done
修改后的代码主要做了以下改动:
- 添加了标记变量
$all_websites_up,用于记录所有网站是否都可用。 - 在连续失败的情况下,将
$all_websites_up设置为false并跳出循环。 - 在重试循环中,使用
$all_websites_up判断所有网站是否都可用。
这个改动确保了在连续失败情况下,能够立即执行重试逻辑,而不是继续循环其他网站。
原文地址: https://www.cveoy.top/t/topic/mOsf 著作权归作者所有。请勿转载和采集!