如果在PVE中安装了群晖,又不想每天关闭PVE(不在家,怕服务器起不来),因此想每天定时关闭开启黑群晖和其他虚拟机释放资源。

在网上查了很多,说在crontab添加命令

00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop
00 6 * * * pvesh create /nodes/pve/qemu/102/status/start

更新: 脚本里面一定要写全路径,写相对路径,输出文件会定位到home目录,我被坑了,之前一直以为crontab不工作,结果是我log写错位置了。下面定时任务不需要用timer,用crontab更简单。

试了一下,没有效果,但是直接执行语句echo "test" >>/test.log 是可以的 。希望有大神解答一下。

没办法,只有另辟蹊径了。使用timer来解决问题

1.首先,SSH链接上PVE或者直接用PVE提供的的shell,写sh脚本来实现虚拟机的开机/关机,核心命令 qm start/stop vm_id,vm_id可在PVE左边数据中心查看

PVE提供的shell如下 

vm_id如下

创建新文件 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查看状态,成功

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐