PVE检测虚拟机是否存活并自动重启

post by rocdk890 / 2023-12-5 16:30 Tuesday linux技术
最近不知道怎么回事,用了200多天的openwrt居然宕机了,关键还是在我早上起来才知道,等我晚上回来处理好后,少不了被家人一顿劈头盖脸,为了防止再出现这样的情况,在网上找了个能在pve里自动监控虚拟机并重启的脚本,当然我只简单优化了下.
系统:PVE 7.x

创建脚本:
vi /root/soft_shell/check_servers.sh
#!/bin/bash

QMPATH="/usr/sbin/qm"
MAX_FAILURES=3  # 连续失败的最大次数
RESET_AFTER_SUCCESS=2  # 连续成功后重置失败计数的阈值

FAILURE_FILE="/path/to/failure_file.txt"  # 存储失败信息的文件路径

declare -A failure_count  # 记录每个虚拟机的连续失败次数

function load_failure_count() {
    if [[ -f "$FAILURE_FILE" ]]; then
        source "$FAILURE_FILE"
    fi
}

function save_failure_count() {
    declare -p failure_count > "$FAILURE_FILE"
}

function check_and_restart() {
    local vm_id="$1"
    local vm_ip="$2"
    local now

    ping -c 4 "$vm_ip" > /dev/null

    if [[ $? != 0 ]]; then
        now=$(date +%s)
        echo "[$now] [NO] id = $vm_id, ip = $vm_ip"

        if [[ -z "${failure_count["$vm_id"]}" ]]; then
            failure_count["$vm_id"]=1  # 初始失败次数为1
        else
            ((failure_count["$vm_id"]++))

            if ((failure_count["$vm_id"] >= MAX_FAILURES)); then
                echo "[$now] [RESTART] Restarting $vm_id after $MAX_FAILURES consecutive failures."
                "$QMPATH" stop "$vm_id"
                "$QMPATH" start "$vm_id"
                failure_count["$vm_id"]=0  # 重置连续失败次数
            fi
        fi
    else
        # 如果ping成功,则重置虚拟机的失败计数
        if [[ -n "${failure_count["$vm_id"]}" && ${failure_count["$vm_id"]} -gt 0 ]]; then
            echo "[$now] [OK] id = $vm_id, ip = $vm_ip"
            failure_count["$vm_id"]=0
        fi
    fi
}

function main() {
    local vm_list="$1"
    local vm_id
    local vm_ip

    load_failure_count

    for each in $vm_list; do
        vm_id=$(echo "$each" | awk -F: '{ print $1 }')
        vm_ip=$(echo "$each" | awk -F: '{ print $2 }')
        check_and_restart "$vm_id" "$vm_ip"
    done

    save_failure_count
}

# 需要检查的虚拟机列表,格式为 vm_id:vm_ip
vm_list="
101:192.168.1.254
102:192.168.1.250
"

main "$vm_list"

保存后,执行:
crontab -e
*/3 * * * * /bin/bash /root/soft_shell/check_servers.sh


脚本来自下面链接,我在其上面进行了简单的优化:
https://blog.lucien.ink/archives/531/
夜空- 本站版权
1、本站所有主题由该文章作者发表,该文章作者与夜空享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和夜空的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:blog.slogra.com/post-806.html

标签: 监控 重启 自动 虚拟机 check pve

评论: