rsync跨网同步时删除目标文件失败,提示“IO error encountered -- skipping file deletion”的排查与解决
rsync跨网同步时删除目标文件失败,提示“IO error encountered -- skipping file deletion”的排查与解决
遇到这种IO错误导致删除失败的情况确实挺闹心的,我来给你梳理几个实用的排查和解决方向,都是实际操作中验证过的:
一、先拿到更详细的错误日志,定位具体问题
你目前用的-v只是基础 Verbose 模式,信息量不够,没法知道到底是哪个文件/目录删不掉。可以把日志级别拉满,或者直接把日志输出到文件里慢慢分析:
sudo rsync -e 'ssh -p 8023 -i /path/to/key' -avvvxW --progress --delete \ --exclude folders/to/exclude \ username@domain.myddns.me:/mnt/RemoteDriveName/ /Volumes/LocalDriveName --log-file=/tmp/rsync_delete_debug.log
跑完同步后去查看/tmp/rsync_delete_debug.log,里面会明确指出哪一个文件删除失败,是权限不足、文件被占用还是磁盘IO问题,直接定位根源。
二、检查本地macOS目标目录的权限与文件状态
macOS的外接磁盘/目录经常会有各种权限或锁定问题:
- 文件被占用:如果某个文件正在被系统或其他应用打开(比如预览里的图片、正在编辑的文档),rsync就没法删除。可以先关闭所有可能访问该目录的应用,或者用
lsof /Volumes/LocalDriveName/可疑文件路径查看哪个进程在占用它,结束进程后再试。 - 权限异常:虽然你用了
sudo,但如果目标目录的ACL权限或者所有者设置有问题,也会阻止删除。可以尝试修复权限:sudo chmod -R u+w /Volumes/LocalDriveName sudo chown -R $(whoami) /Volumes/LocalDriveName - Time Machine干扰:如果Time Machine正在备份这个本地目录,会临时锁定部分文件,建议先暂停Time Machine再执行同步。
三、调整rsync的删除策略与参数
默认的--delete是边同步边删除,有时候会因为文件还在被读取导致冲突,试试换成--delete-after,让rsync先完成所有文件同步,最后再统一执行删除操作:
sudo rsync -e 'ssh -p 8023 -i /path/to/key' -avxW --progress --delete-after \ --exclude folders/to/exclude \ username@domain.myddns.me:/mnt/RemoteDriveName/ /Volumes/LocalDriveName
另外,你用的-W(whole file)参数会跳过增量传输直接传整个文件,虽然大文件传输更快,但如果目标文件处于被使用状态,可能更难删除。可以先临时去掉-W试试,看是不是这个参数导致的冲突。
四、排查跨网SSH连接的稳定性
跨网同步时,SSH连接不稳定也可能导致中途IO错误。先测试一下SSH连接的稳定性:
ssh -p 8023 -i /path/to/key username@domain.myddns.me "while true; do echo test; sleep 1; done"
让这个命令跑个5-10分钟,如果中途断开,说明网络有丢包或超时问题。可以给SSH加上保活参数,防止连接断开:
sudo rsync -e 'ssh -p 8023 -i /path/to/key -o ServerAliveInterval=30 -o ServerAliveCountMax=3' -avxW --progress --delete \ --exclude folders/to/exclude \ username@domain.myddns.me:/mnt/RemoteDriveName/ /Volumes/LocalDriveName
这个参数会让SSH每30秒发一次保活包,连续3次没收到回应才断开连接,能有效提升跨网连接的稳定性。
备注:内容来源于stack exchange,提问作者ginjaemocoes
相关产品推荐
相关产品推荐

