如何编写自动备份并关机脚本

wen 实用脚本 2

从零到一的完整指南

📑 目录导读

  1. 脚本设计的核心逻辑:理解备份与关机的先后顺序与容错机制
  2. 多系统实战代码:Windows(批处理)、Linux(Bash)、跨平台Python方案
  3. 定时触发与安全验证:如何嫁接系统任务计划与防误触
  4. 常见陷阱与故障排除:5个高频问题解答(含问答)
  5. 进阶扩展:日志、加密与云端联动

脚本设计的核心逻辑

在编写自动备份并关机脚本之前,必须厘清三个关键问题:

如何编写自动备份并关机脚本

  • 备份与关机的时序:必须先完成备份验证,再执行关机,如果备份失败,脚本应发送告警或终止关机,避免数据丢失。
  • 目标路径的写权限:脚本运行账户需对备份源目录有读取权限,对备份目标目录有写入权限。
  • 避免“自锁”风险:关机前应释放所有文件句柄,防止系统因进程占用而拒绝关机。

💡 经验法则:在脚本开头添加 $ErrorActionPreference = 'Stop'(PowerShell)或 set -e(Bash),确保任何一步失败都会终止执行。


多系统实战代码

1 Windows 批处理(.bat)方案

@echo off
set source=C:\MyData
set dest=D:\Backup\%date:~0,10%
xcopy "%source%" "%dest%\" /E /I /Y > "%dest%\backup_log.txt" 2>&1
if %errorlevel% equ 0 (
    echo 备份完成,准备关机...
    shutdown /s /f /t 60 /c "备份完成,系统将在1分钟后关机"
) else (
    echo 备份失败,请检查日志
    pause
)

缺点:无压缩功能,需配合第三方工具(如7z)实现增量备份。

2 Linux Bash 脚本

#!/bin/bash
SOURCE="/home/user/documents"
DEST="/mnt/backup/$(date +%Y%m%d_%H%M%S)"
TAR_BALL="${DEST}.tar.gz"
# 创建压缩备份
tar -czf "$TAR_BALL" -C "$(dirname "$SOURCE")" "$(basename "$SOURCE")"
if [ $? -eq 0 ]; then
    echo "Backup successful: $TAR_BALL"
    # 验证备份完整性
    tar -tzf "$TAR_BALL" > /dev/null 2>&1 && sudo shutdown -h +5 "System will shutdown in 5 minutes"
else
    echo "Backup failed" | mail -s "ALERT" admin@email.com
fi

优势:支持压缩、邮件告警、自定义关机延迟,注意 sudo 需要免密配置。

3 Python 跨平台方案(推荐)

import os, shutil, tarfile, time
from datetime import datetime
def backup_and_shutdown(src, dst):
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_path = os.path.join(dst, f"backup_{timestamp}.tar.gz")
    with tarfile.open(backup_path, "w:gz") as tar:
        tar.add(src, arcname=os.path.basename(src))
    # 校验文件大小
    if os.path.getsize(backup_path) > 1024:
        print("备份成功,关机")
        os.system("shutdown /s /t 60" if os.name == 'nt' else "sudo shutdown -h +1")
    else:
        with open("error.log", "w") as f:
            f.write(f"{timestamp} 备份文件过小,已取消")
if __name__ == "__main__":
    backup_and_shutdown("/home/user/docs", "/mnt/backup")

定时触发与安全验证

1 Windows 任务计划程序

  • 打开 taskschd.msc,创建基本任务,触发器选择“每天”或“当系统空闲时”。
  • 操作:启动程序,脚本路径填入 .bat.py 文件。
  • 条件:勾选“只有在计算机使用交流电源时才启动任务”,防止笔记本电池耗尽。

2 Linux crontab

# 每天凌晨2:30执行备份脚本
30 2 * * * /home/script/backup_and_shutdown.sh

建议在脚本内增加时间窗口判断,避免上班时间误关机:

current_hour=$(date +%H)
if [ $current_hour -ge 1 ] && [ $current_hour -le 5 ]; then
    shutdown -h now
fi

3 防误触机制

  • 双因素确认:在关机前写入一个 .lock 文件,下次开机时删掉;若检测到 .lock 存在,则取消关机。
  • 用户交互(非无人值守场景):
    choice /c YN /t 30 /d N /m "确认关机?30秒后自动取消"
    if errorlevel 2 exit /b

常见陷阱与故障排除(含问答)

❓ Q1:为什么备份完成后脚本没有关机?

A:检查权限问题,Linux 下 shutdown 需要 root 权限,请确保脚本通过 sudo 执行,或在 crontab 中使用 @reboot root script.sh

❓ Q2:备份文件可以覆盖,但关机提示“拒绝访问”?

A:系统进程正在使用源文件,在 Windows 下使用 robocopy/R:3 /W:5 参数重试;Linux 下使用 lsof +D /path 找出占用进程后 kill 或跳过。

❓ Q3:如何实现增量备份?

A:Linux 用 rsync -a --link-dest=PREV_BACKUP;Windows 用 robocopy /MIR,Python 可结合 filecmpos.path.getmtime 对比。

❓ Q4:任务计划程序执行时闪退,如何排查?

A:在脚本首行添加 set "PATH=C:\Windows\System32;%PATH%"(Windows)或 #!/bin/bash -x(Linux),将输出重定向到日志文件,script.py > log.txt 2>&1

❓ Q5:脚本执行一半时断电,如何保证备份完整性?

A:使用事务性功能(如 NTFS 日志、ZFS 快照),或在关机前添加 sync 命令(Linux)强制写盘,Python 用 os.sync()


进阶扩展:日志、加密与云端联动

  1. 日志增强:写入 JSON 格式日志,包含时间戳、文件大小、MD5 校验值,便于后续审计。
  2. 加密备份:使用 GPG 对称加密(Python 调用 gnupg 库),或集成 7-Zip 的 AES-256 加密。
  3. 云端同步:在关机前将备份上传至对象存储(如 S3 兼容服务),使用 rclone(Linux)或 aws-cli(Windows)。
  4. 容器化部署:将脚本封装为 Docker 容器,通过 docker run --rm -v /data:/data backup-image 实现隔离执行。

自动备份并关机脚本的核心在于 鲁棒性:优先保证数据安全,再考虑自动化程度,建议在正式环境上线前,先用测试账户在虚拟机中运行一周,验证定时触发、异常处理和日志记录均符合预期,如果你的系统每天产生大量数据,务必在脚本中加入磁盘空间预检,防止因备份塞满硬盘导致关机失败,记得将脚本纳入版本控制(如 Git),方便回退与迭代。

抱歉,评论功能暂时关闭!