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/
评论: