rsync执行后通过状态码判断同步结果:0为完全成功,24/25为软成功(需记录警告),1为命令语法错误(需修复脚本),2/3为硬错误(需告警或重试)。

rsync 命令执行完成后会返回一个状态码(exit code),在自动化脚本中通过检查这个状态码,可以准确判断同步是否成功、失败或出现部分异常。关键不是只看是否为 0,而是要理解不同非零码的含义并做差异化处理。
rsync 常见状态码及其含义
rsync 官方文档定义了多个退出状态,实际脚本中重点关注以下几类:
- 0:成功完成,所有文件都已正确同步,无任何警告或错误
- 1:语法错误或使用错误(如参数拼写错、缺少必要选项)——属于脚本调用问题,需修复脚本本身
- 2:无法访问某些文件/目录(如权限不足、路径不存在)——常见于目标端权限问题或源路径误配
- 3:传输过程中发生 I/O 错误(如磁盘满、网络中断、SSH 连接断开)——最需关注的“运行时失败”
- 24:部分文件因时间戳/大小未变而被跳过(注意:这是正常行为,不表示失败)
- 25:某些文件因权限/属主变更失败但其余成功(例如 --chown 失败)——取决于是否容忍此类差异
Shell 脚本中推荐的状态码判断逻辑
不要简单写成 if [ $? -eq 0 ] 就完事。应区分可恢复错误和需告警的严重错误:
- 状态码为 0 → 认定完全成功,可记录日志或触发后续动作
- 状态码为 24 或 25 → 视为“软成功”,通常无需中断流程,但建议记录为 warning 级别日志
- 状态码为 2 或 3 → 属于硬错误,大概率需人工介入,应发送告警、退出脚本或进入重试逻辑
- 状态码为 1 → 表明脚本存在缺陷(如 rsync 路径写错、变量为空),应直接退出并打印调试信息
实用脚本片段示例
以下是一个简明健壮的判断结构(Bash):
rsync -avz --delete /src/ user@host:/dst/
rsync_status=$?
case $rsync_status in
0)
echo "[OK] Sync completed successfully"
;;
24|25)
echo "[WARN] Sync finished with minor issues (e.g. unchanged files or chown skipped)"
;;
1)
echo "[ERROR] rsync command usage error — check syntax and variables"
exit 1
;;
2|3)
echo "[CRITICAL] Sync failed due to access or I/O error — verify paths, permissions, network"
# 可在此加入告警命令,如 curl 发送企业微信通知
exit 1
;;
*)
echo "[UNKNOWN] rsync returned unexpected exit code: $rsync_status"
exit 1
;;
esac
补充建议:配合 --out-format 和日志增强可观测性
单靠状态码有时不足以定位问题,建议在 rsync 命令中增加:
-
--out-format='%t %o %n%L'输出详细操作记录 - 重定向 stdout/stderr 到带时间戳的日志文件,便于回溯
- 对关键任务启用
--itemize-changes,快速识别哪些文件被删除/更新/跳过
状态码是自动化的“开关信号”,结合日志才能真正实现故障可查、过程可信。

















