#!/bin/bash
# 定义锁文件路径
LOCK_FILE="/tmp/backup_restore.lock"
# 定义备份和恢复操作函数
backup() {
# 备份操作代码
rsync -avz /data /backup && echo "备份成功" || { echo "备份失败"; exit 1; }
}
restore() {
# 恢复操作代码
rsync -avz /backup /data && echo "恢复成功" || { echo "恢复失败"; exit 1; }
}
# 加锁函数
lock() {
while true; do
if mkdir "$LOCK_FILE" 2>/dev/null; then
return 0
fi
sleep 1
done
}
# 解锁函数
unlock() {
rm -rf "$LOCK_FILE"
}
# 主逻辑
case "$1" in
backup)
lock
backup
unlock
;;
restore)
lock
restore
unlock
;;
*)
echo "Usage: $0 {backup|restore}"
exit 1
;;
esac
说明
- 原子性与一致性:通过使用锁文件来确保同一时间只有一个备份或恢复操作在执行,避免数据冲突。
- 高效性:使用
rsync
进行备份和恢复操作,rsync
本身是高效的文件同步工具,并且可以增量同步,减少不必要的数据传输。
- 错误和中断处理:在备份和恢复操作中,如果
rsync
命令执行失败,脚本会输出错误信息并退出,同时解锁,以便后续可以再次尝试操作。