设置Windows虚拟机开启,开启性能模式,win虚拟机关闭,开启节能模式
脚本思路:
- 监控虚拟机状态:通过 qm status VMID 命令检查虚拟机的当前状态,running 表示虚拟机正在运行,stopped 表示虚拟机已关闭。
- 切换 CPU 模式:根据虚拟机状态,自动切换 performance 或 powersave 模式。
- 定期检测虚拟机状态:可以通过 cron 或循环的方式定期检查虚拟机状态。
#!/bin/bash
# 设置环境变量
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 虚拟机 ID
VMID=103
# 日志文件路径
LOG_FILE="/var/log/vm_mode.log"
# 获取虚拟机状态并切换模式
check_vm_status() {
# 获取虚拟机的当前状态
VM_STATUS_OUTPUT=$(qm status $VMID 2>&1)
echo "$(date) - Raw qm status output: $VM_STATUS_OUTPUT" | sudo tee -a $LOG_FILE
# 检查是否成功获得状态
if [[ $VM_STATUS_OUTPUT == *"status:"* ]]; then
VM_STATUS=$(echo "$VM_STATUS_OUTPUT" | grep -i 'status:' | awk '{print $2}' | tr -d '[:space:]')
# 打印当前状态到日志
echo "$(date) - Current VM $VMID status: $VM_STATUS" | sudo tee -a $LOG_FILE
# 如果虚拟机正在运行,切换到性能模式
if [ "$VM_STATUS" == "running" ]; then
echo "$(date) - VM $VMID is running. Switching to performance mode..." | sudo tee -a $LOG_FILE
cpupower frequency-set --governor performance
echo "$(date) - Switched to performance mode for VM $VMID." | sudo tee -a $LOG_FILE
# 如果虚拟机停止,切换到节能模式
elif [ "$VM_STATUS" == "stopped" ]; then
echo "$(date) - VM $VMID is stopped. Switching to powersave mode..." | sudo tee -a $LOG_FILE
cpupower frequency-set --governor powersave
echo "$(date) - Switched to powersave mode for VM $VMID." | sudo tee -a $LOG_FILE
else
echo "$(date) - VM $VMID status unknown. Unable to determine mode change." | sudo tee -a $LOG_FILE
fi
else
echo "$(date) - Error: Could not get VM status. Output: $VM_STATUS_OUTPUT" | sudo tee -a $LOG_FILE
fi
}
# 定期检查虚拟机状态并执行模式切换
while true; do
check_vm_status
sleep 60 # 每分钟检查一次虚拟机状态
done
说明:
-
检测虚拟机状态:qm status VMID 会返回虚拟机的状态,通过 awk '{print 2}' 提取状态信息。
-
切换模式:根据虚拟机的状态,脚本会切换到 performance(运行时)或 powersave(停止时)模式。
-
日志记录:每次切换模式时,都会在 /var/log/vm_mode.log 中记录相关信息。
-
循环检测:通过 while true 循环,每分钟检查一次虚拟机的状态并执行模式切换。
使用方法:
赋予脚本执行权限:
sudo chmod +x /usr/local/bin/vm_mode_switch.sh
运行脚本:
你可以手动运行此脚本,或者通过 cron 定期运行:
sudo /usr/local/bin/vm_mode_switch.sh
在 cron 中定期运行:
如果希望脚本定期执行,可以将其添加到 cron 中。使用 crontab -e 打开 cron 配置,添加以下内容,定期执行:
* * * * * /usr/local/bin/vm_mode_switch.sh
注意事项:
确保脚本有足够的权限来执行 cpupower 命令和写入日志。
通过 sleep 60 每分钟检查虚拟机状态,也可以根据需要调整时间间隔。
这样,脚本就能根据虚拟机的状态动态切换 CPU 模式,并且记录每次模式切换的日志。
查看当前CPU工作模式
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
该命令会返回当前所有 CPU 核心的 governor 模式,常见的模式包括:
- performance(性能模式)
- powersave(节能模式)
- ondemand(动态调节模式)
- conservative(保守模式)
- schedutil(调度器利用模式)
定期清理日志文件脚本
编辑 clear_vmlog.sh 脚本:
sudo nano /usr/local/bin/clear_vmlog.sh
直接删除日志文件:
#!/bin/bash
# 设置日志文件路径
LOG_FILE="/var/log/vm_mode.log"
MAX_SIZE=10485760 # 10 MB in bytes
# 检查日志文件大小
if [ -f "$LOG_FILE" ] && [ $(stat -c %s "$LOG_FILE") -gt $MAX_SIZE ]; then
echo "$(date) - Log file is too large, deleting log..." >> $LOG_FILE
rm "$LOG_FILE" # 删除日志文件
touch "$LOG_FILE" # 创建一个新的空日志文件
chmod 0644 "$LOG_FILE" # 设置文件权限
fi
在此脚本中,当日志文件大小超过 10MB 时,脚本会直接删除 vm_mode.log 文件,并创建一个新的空日志文件。
保存并退出编辑器。
确保脚本有执行权限:
sudo chmod +x /usr/local/bin/clear_vmlog.sh
设置定时任务
编辑 cron 定时任务:
sudo crontab -e
添加以下行,以便每小时运行一次清理脚本:
0 * * * * /usr/local/bin/clear_vmlog.sh
这将确保每小时检查一次日志文件,超出大小限制时直接删除日志文件。
保存并退出。
手动运行脚本(可选)
如果你希望立即测试脚本,可以手动运行它:
sudo /usr/local/bin/clear_vmlog.sh
确认效果
检查 /var/log/vm_mode.log 文件的大小,确保它在每次清理后没有超过你设置的大小:
ls -lh /var/log/vm_mode.log
如果脚本生效,日志文件会在超过指定大小时被删除,并且会创建一个新的空日志文件。
总结
你可以通过修改脚本来 直接删除 日志文件,而不是将其重命名为 .old。
使用 cron 定时任务来定期运行脚本,确保日志文件不会无限制增长。
通过这种方法,你可以确保日志文件始终保持在合理的大小范围内,而不会占用过多磁盘空间。