DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

rsync 3.5.0:/dev/stdin 报 ENOENT

3.5.0可能无法打开管道上的/dev/stdin和stdout,3.5.1已修复。清单改用files-from=-,日志要单独核验,退出0不代表采集成功。

升级到 rsync 3.5.0 后,从管道使用 --files-from=/dev/stdin 可能在打开清单时就报 No such file or directory。同类环境下,--log-file=/dev/stdout 还可能提示无法打开日志、忽略日志设置,但传输最终返回 0。先判断失败的是清单输入或日志输出本身,还是清单中某个要同步的文件。

这个问题涉及 /dev/stdin、/dev/stdout 等路径指向管道描述符时的路径解析。rsync 3.5.1 已列入相关修复,包括管道及用户命名空间中的描述符路径;不能把它写成所有当前版本仍有的缺陷。

核对实际二进制与输入类型

确认任务真正执行的 rsync 版本,尤其是定时任务、容器和远端使用的二进制是否与交互终端一致。发行版可能保留旧版本号但回移修复,需要结合软件包修订和变更记录判断。

如果错误发生在打开 /dev/stdin 时,清单还没有解析完成。此时给清单条目去掉源目录前缀,并不能修复输入路径的打开失败。只有报错指出具体同步条目时,才进一步核对 files-from 清单相对源根的规则。

相同的 /dev/stdout 在连接普通文件时与连接管道时可能表现不同。不要仅凭路径存在就认定可打开,也不要通过改变权限来解决一个描述符类型和路径解析问题。

标准输入清单用文档规定的减号

读取标准输入已有专门的写法 --files-from=-,无需经 /dev/stdin 再打开一次。以下只预演已经审核的清单,源与目标为占位目录:

rsync -ani --files-from=- -- /srv/source/ /srv/backup/

标准输入需要由原有清单生成流程提供,条目仍相对于 /srv/source/。若生成端输出 NUL 分隔记录,应同时使用 --from0;普通逐行清单不能直接与它混用。使用 --files-from 时,-a 不隐含递归选项 -r,是否递归目录要依据原来的同步范围决定。

清单生成失败或只生成一部分时,不能把 rsync 的成功状态当成完整备份成功。包装脚本还需检查生成端的状态;需要经过管道的任务,应明确如何收集各阶段退出状态。

更新到保留安全修复的版本,再核验日志

优先采用平台支持的 3.5.1 或已回移相关修复的软件包。升级前保留当前配置、软件包信息和目标数据的可恢复副本,并检查两端兼容性。不要为了使旧写法继续工作而退回缺少安全修复的版本,也不要关闭路径约束。

日志可以先写入经过授权、目录权限明确的普通文件,或在已修复版本上沿用批准的标准输出采集方式。/dev/fd/1 在某种环境里能打开,不意味着它在所有容器、用户命名空间或受限目录中都是合适的绕行方案。

日志打开失败可能只导致 rsync 忽略日志设置。验收要同时检查传输状态、目标内容、错误输出,以及日志中是否有这次任务的新记录。日志文件存在或命令返回 0,都不足以证明日志已经正常采集。