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
发表评论 取消回复