mac用脚本定时备份文件到nfs ok
mac用脚本定时备份文件到nfs
1. 包含内容
- rsync同步文件
- 编写并执行脚本
- 检查nfs挂载
- 配置crontab
2. rsync同步
同步源/Users/chenchang/searxng/到目的/Volumes/nfs/macdocker/searxng/并保持与源端数据完全一致,包含删除操作
rsync -av --delete --progress /Users/chenchang/searxng/ /Volumes/nfs/macdocker/searxng/
rsync -av --delete --progress /Users/chenchang/newapi/ /Volumes/nfs/macdocker/newapi/
关键点说明:
--delete的作用:它是实现“镜像同步”的关键。如果没有这个参数,源端删除文件后,目标端会一直保留那些过时的废弃文件。-
路径末尾的斜杠
/:- 源路径写成
/Users/chenchang/newapi/(有斜杠):拷贝newapi目录下的内容。 - 如果漏写斜杠:可能会在目标目录下再创建一个
newapi子目录,变成/Volumes/nfs/macdocker/newapi/newapi/。
- 源路径写成
3. 编写并执行脚本含检查nfs挂载
创建脚本
cd /Users/chenchang
touch rsync_dockerdata.sh
#创建脚本
chmod a+x rsync_dockerdata.sh
#赋予权限
vim rsync_dockerdata.sh
#vim编辑
脚本内容如下
#!/bin/bash
# --- 自动日志配置 ---
# 自动生成日志
LOG_FILE="/Users/chenchang/rsync_cron.log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "---------------------------------------"
echo "任务开始时间: $(date)"
# 定义检查函数
# 为了防止 NFS 掉线导致文件错拷进本地磁盘,加入挂载检查
check_mount() {
# 检查目标文件夹里是否包含某个你确定的文件夹(例如 macdocker)
# 如果不存在,说明 NFS 没挂载
if [ ! -d "/Volumes/nfs/macdocker" ]; then
echo "❌ 错误: NFS 盘未挂载!为了防止占用本地磁盘,已停止任务。"
exit 1
fi
}
# --- 执行同步 ---
# 1. 检查挂载状态
check_mount
echo "✅ NFS 已通过检测,开始同步第一个目录: searxng..."
rsync -av --delete --progress /Users/chenchang/searxng/ /Volumes/nfs/macdocker/searxng/
# 2. 等待 5 秒
echo "等待 5 秒..."
sleep 5
# 3. 再次检查挂载状态(防止中间掉线)
check_mount
echo "✅ 开始同步第二个目录: newapi..."
rsync -av --delete --progress /Users/chenchang/newapi/ /Volumes/nfs/macdocker/newapi/
echo "🎉 所有任务完成!"
⚠️ 为什么检查挂载很重要?
- 保护系统盘:如果 NFS 掉线,几 GB 甚至几十 GB 的 API 数据会直接塞进你 Mac 的系统盘,可能导致系统卡死。
- 避免逻辑混乱:如果你在没挂载时同步了,下次挂载 NFS 后,你会发现 NFS 里的内容还是旧的,而你本地却多了一堆占空间的文件。
4.执行脚本测试
cd /Users/chenchang
./rsync_dockerdata.sh
5. 配置crontab实现定时任务
编辑定时任务
crontab -e
填入以下内容
0 0 */7 * * /bin/bash /Users/chenchang/rsync_dockerdata.sh
查看当前任务
crontab -l
6.查看日志
cat /Users/chenchang/rsync_cron.log