PVE检测虚拟机是否存活并自动重启
最近不知道怎么回事,用了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/


评论: