如何借助 Crontab 实现 Linux 系统定时自动化全备份

作者:袖梨 2026-07-07
<p>答案是:编写带时间戳和自动清理的备份脚本并配置 crontab 定时执行。脚本需声明解释器与 PATH,定义备份目录、源路径和时间戳,用 tar 排除特殊目录压缩,find 清理 7 天前文件,记录日志;chmod +x 后手动测试;crontab 添加 0 2 * 执行条目,重定向日志便于排查;注意路径、% 转义、工作目录及权限问题。</p>

用 Crontab 实现 Linux 全备份,关键不是堆命令,而是让每次备份可靠、可查、不踩坑。核心是:一个能独立跑通的脚本 + 一条写对的 crontab 条目 + 必要的日志和清理逻辑。

写一个带时间戳和自动清理的备份脚本

脚本要自己能运行成功,Crontab 才可能成功。推荐放在 /usr/local/bin/backup-full.sh,内容示例:

  • 开头声明解释器和 PATH:# !/bin/bash
    PATH=/usr/local/bin:/usr/bin:/bin
    export PATH
  • 定义变量:BACKUP_DIR="/backup/full"
    SOURCE="/" # 全盘备份慎用,建议改用 /home /etc /var/www 等关键目录
    DATE=$(date +%Y%m%d_%H%M)
  • 执行压缩(跳过临时文件和挂载点):tar --exclude='/proc' --exclude='/sys' --exclude='/dev' --exclude='/backup' -zcf $BACKUP_DIR/system_$DATE.tar.gz $SOURCE
  • 保留最近 7 天备份:find $BACKUP_DIR -name "system_*.tar.gz" -mtime +7 -delete
  • 加一行日志记录:echo "$(date): Full backup saved to system_$DATE.tar.gz" >> /var/log/backup.log

保存后执行 chmod +x /usr/local/bin/backup-full.sh,再手动运行一次测试是否生成文件、无报错。

用 crontab 添加定时任务(用户级)

运行 crontab -e,新增一行(注意空格分隔,不是 Tab):

0 2 * * * /usr/local/bin/backup-full.sh >> /var/log/backup.log 2>&1

这表示每天凌晨 2 点执行。其中 > /var/log/backup.log 2>&1 把标准输出和错误都记进日志,方便排查失败原因。

确认添加成功:运行 crontab -l 查看列表。别忘了检查 cron 服务是否运行:systemctl status cron(或 crond,取决于发行版)。

避免常见失效问题

  • 绝对路径必须写全:脚本里所有命令(如 tar、find、date)尽量用 /bin/tar/usr/bin/find,或靠开头的 PATH 声明兜底
  • 百分号要转义:crontab 中 date 命令的 % 符号前必须加反斜杠,否则会当作注释处理,例如 %Y%m%d
  • 不要依赖当前工作目录:脚本开头加 cd / 或指定完整路径,避免因 crontab 启动时 pwd 不确定导致路径错误
  • 密码类操作别硬编码:如果备份涉及 MySQL,用 ~/.my.cnf 配置文件存认证信息,而不是在脚本里写 -p'xxx'

更稳妥的替代方式(可选)

如果担心用户级 crontab 权限或环境不一致,可用系统级配置:

  • 编辑 sudo nano /etc/crontab,添加一行:0 2 * * * root /usr/local/bin/backup-full.sh >> /var/log/backup.log 2>&1
  • 或把脚本放入 /etc/cron.daily/ 目录(需去掉 .sh 后缀并确保可执行),由系统自动按 daily 规则调度

两种方式都要求脚本本身已通过手动测试,且日志路径有写入权限。

相关文章

精彩推荐