基于 systemd 和 inotify 的自动化备份解决方案,支持目录监控和定时备份。
- 实时监控:使用 inotifywait 监控指定目录的文件变化
- 定时备份:每天凌晨 2 点自动执行备份任务
- 增量标记:只备份有变化的目录,避免不必要的压缩操作
- 版本管理:自动维护备份文件数量,保留最近 N 个版本
- 配置灵活:INI 格式配置文件,易于维护
- Systemd 集成:服务化管理,开机自启
vps_backup_scripts/
├── monitor.sh # 监控脚本(前台运行,由 systemd 托管)
├── backup.sh # 备份脚本(定时执行)
├── monitor_config.conf # 配置文件
├── monitor.service # Monitor systemd 服务文件
├── backup.service # Backup systemd 服务文件
├── backup.timer # Backup systemd 定时器文件
└── README.md # 使用说明
# 安装 inotify-tools(用于目录监控)
sudo apt-get install inotify-tools # Debian/Ubuntu
sudo yum install inotify-tools # CentOS/RHEL
# 安装 zip(用于文件压缩)
sudo apt-get install zip # Debian/Ubuntu
sudo yum install zip # CentOS/RHELgit clone https://github.com/mast1ren/vps_backup_scripts.git
cd vps_backup_scripts编辑 monitor_config.conf 文件:
[BACKUP]
MARK_DIR="/path/to/marks" # 标记文件存储目录
WATCH_DIRS="blog,reader,nginx-conf" # 监控项目列表(逗号分隔)
TARGET_DIR="/path/to/backup" # 备份文件存储目录
BACKUP_NUM=3 # 保留备份版本数量
RETRY_COUNT=2 # 单个项目失败后的重试次数
MONITOR_RESTART_RETRIES=3 # 监控子进程故障后的重启重试次数
[blog]
TYPE="DIR" # 类型:DIR(目录)或 FILE(文件)
PATH="/var/www/blog" # 监控路径
[reader]
TYPE="DIR"
PATH="/home/user/reader-server"
[nginx-conf]
TYPE="DIR"
PATH="/etc/nginx/conf.d"配置说明:
MARK_DIR:存放变化标记文件的目录,monitor 检测到变化时会创建标记WATCH_DIRS:要监控的项目名称列表,与下方的配置块对应TARGET_DIR:备份压缩包的存储目录BACKUP_NUM:每个项目保留的最大备份版本数RETRY_COUNT:单个项目备份失败后的重试次数,总尝试次数为RETRY_COUNT + 1MONITOR_RESTART_RETRIES:监控子进程异常退出后的重启重试次数,总尝试次数为MONITOR_RESTART_RETRIES + 1HEALTH_CHECK_INTERVAL:不在配置文件中开放,脚本内固定为30秒,格式为正整数秒MARK_DIR、WATCH_DIRS、TARGET_DIR:这些关键配置不能为空;脚本启动时会做快速检查,缺失则直接报错退出[项目名]:每个监控项目的详细配置TYPE:资源类型,DIR 或 FILEPATH:要监控/备份的实际路径
根据脚本实际安装位置,修改以下文件中的路径:
monitor.service
# 修改为脚本实际安装目录
ExecStart=/bin/bash /your/actual/path/monitor.shbackup.service
# 修改为 backup.sh 的实际安装路径
ExecStart=/bin/bash /your/actual/path/backup.sh# 复制服务文件到 systemd 目录
sudo cp monitor.service /etc/systemd/system/
sudo cp backup.service /etc/systemd/system/
sudo cp backup.timer /etc/systemd/system/
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用并启动监控服务(前台运行,由 systemd 托管)
sudo systemctl enable monitor.service
sudo systemctl start monitor.service
# 启用定时备份任务(每天凌晨2点执行)
sudo systemctl enable backup.timer
sudo systemctl start backup.timer-
监控阶段(monitor.sh)
- 以前台方式运行,由 systemd 接管进程生命周期
- 使用 inotifywait 监控配置文件中指定的目录
- 检测到文件变化时,创建标记文件(格式:
项目名.mark) - 标记文件存储在
MARK_DIR目录下 - 定期检查各监控子进程状态,发现退出时会按
MONITOR_RESTART_RETRIES自动重试拉起 - 如果某个项目当天重试后仍然失败,会记录失败状态,并在当天暂停该项目的后续健康检查,到第二天再恢复尝试;其他项目不受影响
- 备份脚本每天运行前会再次输出这些未恢复的监控错误
-
备份阶段(backup.sh)
- 每天凌晨 2 点由 systemd timer 触发执行
- 检查项目对应的标记文件,有标记则执行备份
- 压缩目标目录/文件为 zip 格式
- 移动到
TARGET_DIR并维护版本数量 - 成功后删除标记文件;如果失败则按
RETRY_COUNT重试,最终失败时保留标记文件,等待下次继续备份
# 查看监控服务状态
sudo systemctl status monitor.service
# 停止/重启监控服务
sudo systemctl stop monitor.service
sudo systemctl restart monitor.service
# 查看备份定时器状态
sudo systemctl status backup.timer
# 查看备份定时器列表
sudo systemctl list-timers
# 手动执行一次备份
sudo systemctl start backup.service
# 查看服务日志
sudo journalctl -u monitor.service -f
sudo journalctl -u backup.service -f脚本会在脚本目录下生成日志文件:
monitor.log:监控脚本日志,记录目录变化和监控状态backup.log:备份脚本日志,记录备份过程和结果
# 查看监控日志
tail -f /path/to/vps_backup_scripts/monitor.log
# 查看备份日志
tail -f /path/to/vps_backup_scripts/backup.log编辑 backup.timer 文件,修改 OnCalendar 行:
# 每天凌晨 2 点
OnCalendar=*-*-* 02:00:00
# 每天凌晨 3 点 30 分
OnCalendar=*-*-* 03:30:00
# 每周日凌晨 1 点
OnCalendar=Sun *-*-* 01:00:00修改后需要重新加载:
sudo systemctl daemon-reload
sudo systemctl restart backup.timer- 编辑
monitor_config.conf - 在
WATCH_DIRS中添加项目名称 - 添加对应的配置块
[BACKUP]
WATCH_DIRS="blog,reader,new-project"
RETRY_COUNT=2
[new-project]
TYPE="DIR"
PATH="/path/to/new-project"- 重启监控服务
sudo systemctl restart monitor.service修改 monitor_config.conf 中的 BACKUP_NUM:
[BACKUP]
BACKUP_NUM=5 # 保留最近5个版本# 检查 inotify-tools 是否安装
which inotifywait
# 检查锁文件
ls -la /var/run/backup_monitor.pid
sudo rm /var/run/backup_monitor.pid # 清除过期锁文件
# 查看详细错误
sudo journalctl -u monitor.service -n 50# 检查 timer 是否启用
sudo systemctl is-enabled backup.timer
# 查看下次执行时间
sudo systemctl list-timers | grep backup
# 检查标记文件是否存在
ls -la /path/to/marks/
# 手动测试备份脚本
sudo bash /path/to/backup.sh- 确认目录路径正确且有权限访问
- 检查 inotify 监控限制:
cat /proc/sys/fs/inotify/max_user_watches - 必要时增加限制:
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches
- 权限要求:脚本需要有权限访问监控目录和备份目录
- 磁盘空间:确保备份目标目录有足够空间
- 标记文件清理:成功备份后会自动删除标记文件
- 时区设置:备份时间基于系统时区
- 并发保护:monitor 脚本有锁机制,防止多实例运行