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 判断所有网站是否都可用。

这个改动确保了在连续失败情况下,能够立即执行重试逻辑,而不是继续循环其他网站。

Bash 脚本修复:网站连续不可用时重试逻辑优化

原文地址: https://www.cveoy.top/t/topic/mOsf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录