如果在PVE中安装了群晖,又不想每天关闭PVE(不在家,怕服务器起不来),因此想每天定时关闭开启黑群晖和其他虚拟机释放资源。
在网上查了很多,说在crontab添加命令
00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop
00 6 * * * pvesh create /nodes/pve/qemu/102/status/start
试了一下,没有效果,后来发现我在crontab中执行sh脚本也是不执行,但是直接执行语句echo "test" >>/test.log 是可以的 。希望有大神解答一下。
没办法,只有另辟蹊径了。使用timer来解决问题
1.首先,写sh脚本来实现虚拟机的开机/关机,核心命令 qm start/stop vm_id,vm_id可在PVE左边数据中心查看
创建新文件 vi /opt/shells/vm-start.sh
内容如下
#!/bin/bash
# 虚拟机ID存入数组,用空格隔开
vms=("100" "105")
echo " $(date +"%Y-%m-%d %H:%M:%S") vm-start 启动">> TimerVM.txt
for vm_id in "${vms[@]}"; do
status=$(qm status $vm_id | grep 'status' |awk '{print $2}')
if [[ "$status" != "running" ]]; then
echo " $(date +"%Y-%m-%d %H:%M:%S") 虚拟机 $vm_id 正在启动">> TimerVM.txt
qm start $vm_id
fi
sleep 5
tempStatus=$(qm status $vm_id | grep 'status' |awk '{print $2}')
if [[ "$status" == "running" ]]; then
echo " $(date +"%Y-%m-%d %H:%M:%S") 虚拟机 $vm_id 已经启动">> TimerVM.txt
fi
done
再创建新文件 vi /opt/shells/vm-stop.sh
内容如下(因为我黑群用的它自动的定时关机,所以这里就不写黑群晖的vm_id,也不建议用命令暴力结束黑群晖,免得数据丢失。如果有需要可以写在数组里面,用空格隔开)
#!/bin/bash
vms=("105")
echo " $(date +"%Y-%m-%d %H:%M:%S") vm-stop.sh开始">> TimerVM.txt
for vm_id in "${vms[@]}"; do
status=$(qm status $vm_id | grep 'status' |awk '{print $2}')
if [[ "$status" == "running" ]]; then
echo " $(date +"%Y-%m-%d %H:%M:%S") 虚拟机 $vm_id 正在停止">> TimerVM.txt
qm stop $vm_id
fi
sleep 5
tempStatus=$(qm status $vm_id | grep 'status' |awk '{print $2}')
if [[ "$status" == "stopped" ]]; then
echo " $(date +"%Y-%m-%d %H:%M:%S") 虚拟机 $vm_id 已经停止">> TimerVM.txt
fi
done
2. 创建service
创建新文件 vi /etc/systemd/system/vm-start.service
内容如下
[Unit]
Description=vm-start Service
[Service]
Type=simple
ExecStart=/opt/shells/vm-start.sh
User=root
创建新文件 vi /etc/systemd/system/vm-stop.service
[Unit]
Description=vm-stop Service
[Service]
Type=simple
ExecStart=/opt/shells/vm-stop.sh
User=root
测试 可用 systemctl start vm-start.service和systemctl start vm-stop.service命令看虚拟机是否开关机
3,创建timer
创建新文件 vi /etc/systemd/system/vm-start.timer,我设置的每天6.40运行,可以改时间,Timer里面除了Oncalendar还有其他选项,可以自行百度
内容如下
[Unit]
Description=Run vm-start.sh every day at 7 AM
[Timer]
OnCalendar=*-*-* 06:40:00
#OnUnitActiveSec=10s
Unit=vm-start.service
[Install]
WantedBy=multi-user.target
创建新文件 vi /etc/systemd/system/vm-stop.timer
内容如下,时间自行修改
[Unit]
Description=Run vm-start.sh every day at 7 AM
[Timer]
OnCalendar=*-*-* 23:10:00
#OnUnitActiveSec=10s
Unit=vm-stop.service
[Install]
WantedBy=multi-user.target
~
4.启动timer,每次更新相应timer,都需要执行相应的代码
执行命令启动vm-start.timer
systemctl daemon-reload
systemctl enable vm-start.timer
systemctl start vm-start.timer
执行命令启动vm-stop.timer
systemctl daemon-reload
systemctl enable vm-stop.timer
systemctl start vm-stop.timer
最后,可用systemctl status vm-start.timer查看状态,成功