PVE停止所有虚拟机然后关机 。


#!/bin/bash

# 检查是否以 root 身份运行
if [[ $EUID -ne 0 ]]; then
   echo "请以 root 权限运行此脚本。" 
   exit 1
fi

# 设置强制关机的时间(10分钟后)
FORCE_SHUTDOWN_TIME=600 # 秒

echo "系统将在 $((FORCE_SHUTDOWN_TIME / 60)) 分钟后强制关机。"
shutdown -h +10 &

# 记录脚本开始时间
start_time=$(date +%s)

echo "开始关闭所有容器..."
# 停止所有运行中的容器
for container in $(pct list | awk 'NR>1 {print $1}'); do
    echo "正在关闭容器 $container..."
    pct stop $container &
done

echo "开始关闭所有虚拟机..."
# 停止所有运行中的虚拟机
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
    echo "正在关闭虚拟机 $vmid..."
    qm shutdown $vmid --timeout 60 &
done

# 等待容器和虚拟机关闭完成,最长等待10分钟
while true; do
    # 当前时间
    current_time=$(date +%s)
    elapsed_time=$((current_time - start_time))

    # 检查是否超过强制关机时间
    if [[ $elapsed_time -ge $FORCE_SHUTDOWN_TIME ]]; then
        echo "时间已到,强制关机。"
        break
    fi

    # 检查是否所有虚拟机和容器都已关闭
    running_containers=$(pct list | awk 'NR>1 {print $1}')
    running_vms=$(qm list | awk 'NR>1 {print $1}')

    if [[ -z "$running_containers" && -z "$running_vms" ]]; then
        echo "所有容器和虚拟机已关闭。准备关机。"
        break
    fi

    echo "正在等待虚拟机和容器关闭... 已等待 $((elapsed_time / 60)) 分钟。"
    sleep 30
done

# 强制关闭剩余的虚拟机
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
    if qm status $vmid | grep -q "running"; then
        echo "强制关闭虚拟机 $vmid..."
        qm stop $vmid
    fi
done

# 强制关机(确保系统关闭)
echo "现在强制关闭电源..."
shutdown -h now

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部