一、安装必要工具
在Debian系统上,首先需要安装inotify-tools(提供inotifywait命令,用于监控文件系统事件)和rsync(用于高效同步变化的文件)。通过以下命令安装:
sudo apt update
sudo apt install inotify-tools rsync
inotify-tools是监控文件变化的核心工具,rsync则负责将变化的文件增量同步到备份位置,两者结合可实现“触发式”备份。
二、确定监控范围与备份策略
/home/user/Documents、/var/www/html(网站数据)、/etc(系统配置文件)),避免监控整个系统(如/),以减少性能消耗。/backup)或远程服务器(通过SSH同步,更安全)。远程备份需提前配置SSH免密登录(使用ssh-keygen生成密钥对,并将公钥添加到远程服务器的~/.ssh/authorized_keys中)。rsync -avz),避免全量备份浪费带宽和时间;--exclude参数排除临时文件、日志文件或大文件(如--exclude='*.tmp' --exclude='logs/');backup_20251025),并限制保留数量(如保留最近7天备份)。三、编写监控与备份脚本
以下是一个结合inotifywait与rsync的Shell脚本示例,实现“文件变化→立即同步”的实时备份:
#!/bin/bash
# 配置参数
SOURCE_DIR="/path/to/source" # 监控的源目录(需替换为实际路径)
BACKUP_DIR="/path/to/backup" # 本地备份目录(或远程目录,如user@remote:/backup)
EXCLUDE_LIST="--exclude='*.tmp' --exclude='logs/'" # 排除的文件/目录
# 确保备份目录存在
mkdir -p "$BACKUP_DIR"
# 使用inotifywait监控源目录(递归监控,持续运行)
inotifywait -mrq --format '%w%f' -e create,modify,delete,move "$SOURCE_DIR" | while read FILE
do
# 获取当前时间戳(用于创建备份目录)
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_SUBDIR="$BACKUP_DIR/backup_$TIMESTAMP"
echo "[$(date)] 检测到文件变化:$FILE,开始备份..."
# 执行rsync同步(增量同步,保留权限与时间戳,删除目标端多余文件)
rsync -avz --delete $EXCLUDE_LIST "$SOURCE_DIR/" "$BACKUP_SUBDIR/"
# 检查rsync执行结果
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功:$BACKUP_SUBDIR"
else
echo "[$(date)] 备份失败,请检查日志!"
fi
done
脚本说明:
inotifywait -mrq:-m表示持续监控,-r表示递归监控子目录,-q表示静默模式(仅输出错误信息);-e create,modify,delete,move:监控的文件事件类型(创建、修改、删除、移动);rsync -avz --delete:-a表示归档模式(保留权限、时间戳等),-v表示详细输出,-z表示压缩传输,--delete表示删除目标端不存在的文件(保持一致性)。四、优化性能与可靠性
/var/log),可通过-r参数仅监控必要的子目录。/etc/sysctl.conf),增加fs.inotify.max_user_instances(最大监控实例数,默认128)、fs.inotify.max_user_watches(单个实例最大监控文件数,默认8192),以适应大规模监控需求。修改后执行sudo sysctl -p生效。nohup命令将脚本放入后台运行,并将输出重定向到日志文件(如nohup ./backup_monitor.sh >> /var/log/inotify_backup.log 2>&1 &),便于后续排查问题。rsync返回值判断),当备份失败时发送邮件或短信告警(可使用mail命令或第三方告警工具,如Prometheus Alertmanager)。五、高级扩展:结合systemd管理脚本
为确保脚本在系统重启后自动运行,可将其封装为systemd服务:
sudo nano /etc/systemd/system/inotify-backup.service
[Unit]
Description=Inotify-based Real-time Backup Service
After=network.target
[Service]
Type=simple
ExecStart=/path/to/backup_monitor.sh
Restart=always
User=your_username # 替换为运行脚本的用户(如root或普通用户)
[Install]
WantedBy=multi-user.target
sudo systemctl enable inotify-backup.service
sudo systemctl start inotify-backup.service
sudo systemctl status inotify-backup.service
通过systemd管理,可实现脚本的自动重启、状态监控与日志收集(通过journalctl -u inotify-backup.service查看日志)。