一、 建立自动快照程序/etc/snapshot/snapshot.sh
#!/bin/bash
# 完整路径定义,避免cron环境问题
CONFIG_FILE="/etc/snapshot/num.1"
MAX_SNAPSHOT=15
VM_IDS=(301 302 303)
QM_CMD="/usr/sbin/qm" # 使用qm的完整路径
# 日志函数,便于调试
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/snapshot.log
}
# 初始化日志
log_message "=== 开始执行快照任务 ==="
# 检查qm命令是否存在
if [[ ! -x "$QM_CMD" ]]; then
log_message "错误: 找不到qm命令或没有执行权限: $QM_CMD"
exit 1
fi
# 读取计数器
if [[ -f "$CONFIG_FILE" ]] && [[ "$(cat "$CONFIG_FILE" 2>/dev/null)" =~ ^[0-9]+$ ]]; then
i=$(cat "$CONFIG_FILE")
log_message "从 $CONFIG_FILE 读取计数器值: $i"
else
i=1
log_message "配置文件不存在或格式错误,使用默认值: $i"
fi
# 快照操作函数
perform_snapshot_operations() {
local snapshot_name="letter$1"
local success_count=0
local total_vms=${#VM_IDS[@]}
log_message "处理快照: $snapshot_name"
for vm_id in "${VM_IDS[@]}"; do
# 删除旧快照(如果存在)
if "$QM_CMD" delsnapshot "$vm_id" "$snapshot_name" 2>/dev/null; then
log_message " 虚拟机 $vm_id: 删除旧快照 $snapshot_name 成功"
else
log_message " 虚拟机 $vm_id: 没有找到快照 $snapshot_name (可能不存在)"
fi
# 创建新快照
if "$QM_CMD" snapshot "$vm_id" "$snapshot_name" --description "auto"; then
log_message " 虚拟机 $vm_id: 创建快照 $snapshot_name 成功"
((success_count++))
else
log_message " 虚拟机 $vm_id: 创建快照 $snapshot_name 失败"
fi
done
log_message "完成: 成功处理 $success_count/$total_vms 台虚拟机"
}
# 根据计数器值执行操作
if [[ $i -lt $MAX_SNAPSHOT ]]; then
log_message "当前计数器 $i < $MAX_SNAPSHOT,执行正常循环"
perform_snapshot_operations "$i"
((i++))
else
log_message "当前计数器 $i >= $MAX_SNAPSHOT,重置为1"
i=1
perform_snapshot_operations "$i"
fi
# 保存计数器值
if echo "$i" > "$CONFIG_FILE" 2>/dev/null; then
log_message "保存计数器值 $i 到 $CONFIG_FILE 成功"
else
log_message "错误: 无法保存计数器值到 $CONFIG_FILE"
exit 1
fi
log_message "=== 快照任务执行完成 ===\n"
exit 0
二、 创建任务 修改crontab文件,#前最后一行加入00 00 * * * root /etc/snapshot/snapshot.sh
三、 重新cron服务Service cron restart