定时运行脚本,检测到所有虚拟机关闭了则关机
#!/bin/bash
# 检查所有虚拟机是否已经关闭
someone_up=0
for vmid in $(/usr/sbin/qm list | awk 'NR>1 {print $1}'); do
status=$(/usr/sbin/qm status $vmid)
if ! echo "$status" | grep -q "stopped"; then
someone_up=1
break
fi
done
# 如果有虚拟机没有关闭则退出检测
if [ $someone_up -eq 1 ]; then
#echo "还有虚拟机在运行" >> /var/log/isAllDown.log
exit 0
fi
# 如果检测到所有虚拟机已经关闭,则延时再确认
sleep 15 # 等待15秒
someone_up=0
for vmid in $(/usr/sbin/qm list | awk 'NR>1 {print $1}'); do
status=$(/usr/sbin/qm status $vmid)
if ! echo "$status" | grep -q "stopped"; then
someone_up=1
break
fi
done
# 确认所有虚拟机都关闭了,并且开机时间超过了5分钟,则关闭PVE主机
if [ $someone_up -eq 0 ]; then
uptime_seconds=$(awk '{print int($1)}' /proc/uptime)
if [ "$uptime_seconds" -gt 300 ]; then # 系统开机时间大于5分钟
echo "所有虚拟机都已关闭,正在关闭PVE主机..." >> /var/log/isAllDown.log
/usr/sbin/shutdown -h now
fi
else
#echo "还有虚拟机在运行" >> /var/log/isAllDown.log
exit 0
fi
添加定时任务crontab -e
* * * * * /usr/local/sbin/isAllDown.sh
定时任务最快1分钟检测一次,想要效果更好的话,可以考虑在开机后每几秒钟调用脚本检测。
523

被折叠的 条评论
为什么被折叠?



