rsync 拒绝排除目录

rsync 拒绝排除目录

我正在尝试使用 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

相关内容