我正在尝试使用 rsync 制作操作系统备份并将其放入 crontab。它本身运行良好,但由于某种原因,它在查看排除项时拒绝考虑 /export......
0 2 * * 0 rsync -aAXv / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/export/*"} /media/backup-disk/server-backup/ >/dev/null 2>&1
但它确实从备份中排除了所有其他文件夹。
我想要排除这个的一般原因/export/*
是由于这个备份磁盘也被安装为绑定到 /export,因为磁盘与远程服务器有 nfs 共享。
由于它确实包含以下内容:/export/*
由于 rsync 中的循环导致我的磁盘不断满,因为它开始将磁盘本身备份到自身(/export/backup-disk/ -> /media/backup-disk/server-backup)
我的 /media/backup-disk 导出的挂载如下/etc/fstab
:
/media/backup-disk /export/backup-disk none bind 0 0
所以我的问题是,为什么它/export/*
在 rsync 的排除选项内而被包含,以及如何解决这个问题?
编辑:
使用 --stats --progress 进行试运行的结果(不将 stout en stin 重定向到 /dev/null):
sudo rsync -aAXv --stats --progress / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/export/*"} /media/backup-disk/test/ > /media/backup-disk/test.txt
cat /media/backup-disk/test.txt | grep -A1 export/
export/
home/
--
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__init__.py
9,060 100% 38.98kB/s 0:00:00 (xfr#17141, ir-chk=1174/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/day.py
12,609 100% 54.24kB/s 0:00:00 (xfr#17142, ir-chk=1173/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/export_custom_job.py
12,034 100% 51.77kB/s 0:00:00 (xfr#17143, ir-chk=1172/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/job.py
8,970 100% 38.59kB/s 0:00:00 (xfr#17144, ir-chk=1171/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/__init__.cpython-38.pyc
8,809 100% 37.90kB/s 0:00:00 (xfr#17145, ir-chk=1169/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/day.cpython-38.pyc
12,206 100% 52.28kB/s 0:00:00 (xfr#17146, ir-chk=1168/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/export_custom_job.cpython-38.pyc
11,859 100% 50.79kB/s 0:00:00 (xfr#17147, ir-chk=1167/22834)
home/user/.local/lib/python3.8/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/job.cpython-38.pyc
9,302 100% 39.84kB/s 0:00:00 (xfr#17148, ir-chk=1166/22834)
...
这表明它确实排除了导出,但不知何故,每次 cron 运行时我仍发现我的磁盘已满,因为它仍将 /export 里面的东西复制到我的服务器备份目录中...
我忘记在这里提到的另一件事是,我最初以为这可能是一个忘记的问题/export/*
,后来将其添加到 cron 中,但忘记重新启动(因此没有 cron 计划重新启动),但即使重新启动后,它仍然设法/export/*
使用 cron 进行复制。每次需要从 cron 运行命令时,它都应该能够处理对 cron 的编辑,因此需要重新启动似乎有点愚蠢,但我想确保它在重新启动后不会得到解决...
答案1
看来问题确实像@steeldriver 提到的那样,是 cron 的运行方式(在 sh 中,而不是在 bash 或 zsh 或任何其他 shell 中)。这使其与排除列表的括号扩展不兼容。
将 shell 添加到 cron 的提示并不能解决此问题,但将命令放入脚本中并运行该脚本确实解决了该问题。
所以我现在有一个包含以下内容的脚本:
#!/bin/zsh
rsync -aAXv --stats --progress / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/export/*"} /media/backup-disk/test > /dev/null 2>&1
并按照以下 cron 使其每周日晚上 2 点运行:
0 2 * * 0 /opt/scripts/rsync-os-backup