Linux大文件续传核心是预防错误、设计可重入逻辑及显式控制行为;须禁用scp改用rsync,正确配置--partial-dir、--append-verify、--checksum等参数,并加入状态检查与自动降级策略。

Linux运维脚本处理大文件传输中断续传,核心不是“修复错误”,而是**预防错误发生 + 设计可重入逻辑 + 显式控制续传行为**。很多所谓“续传错”,其实是参数误用、路径权限混乱、校验缺失或对rsync机制理解偏差导致的。下面从实操角度分几类讲清楚。
明确续传方式,别混用 scp 和 rsync 逻辑
scp 本身不支持断点续传;中断后若直接重跑 scp,会覆盖目标文件,等于从头再来。正确做法是:中断后立即改用 rsync 接续——但必须带对参数:
- 用 rsync --partial --append-verify --checksum 替代单纯
--partial:前者确保追加位置准确且校验完整,后者只保留临时文件,不自动续写 - 避免
--rsh=ssh和-e "ssh"混用,统一用-e "ssh -o ConnectTimeout=10 -o ServerAliveInterval=30"加强连接稳定性 - 不要在同一个目标路径上交替使用 scp 和 rsync:scp 写入的文件无校验标记,rsync 可能误判为“已损坏”而全量重传
临时文件与目录权限必须显式管理
rsync 续传依赖中间状态(如未完成文件、临时目录),一旦权限或路径出错,就会报 failed: Permission denied 或静默跳过续传:
- 用 --partial-dir=/path/to/tmp 指定绝对路径,并确保该路径在源端和目标端都存在且可写(同步方向决定哪一端需要该目录)
- 不用默认的
.~tmp~后缀临时文件:它易被清理工具误删,也难排查;--partial-dir提供可控的隔离空间 - 脚本开头加检查:
[ ! -d "/tmp/rsync-partial" ] && mkdir -m 700 /tmp/rsync-partial,防止因目录缺失导致续传失败
避免时间戳/大小误判引发全量重传
rsync 默认靠文件大小 + 修改时间判断是否跳过。大文件中断后,目标文件大小变了、时间也更新了,但内容不全——这时若不干预,rsync 很可能判定“源已变更”,触发全量重传:
- 加 --size-only(快,适合可信环境)或更稳妥的 --checksum(逐块校验,推荐用于关键文件)
- 禁用时间戳干扰:--ignore-times,强制只按内容或大小比对(注意:仅在确认源文件未被修改时使用)
- 慎用
--update:它只传“更新过”的文件,但中断后的目标文件时间戳新、内容旧,反而会被跳过,导致续传失效
脚本中加入状态检查与自动降级策略
纯靠重试命令不够,运维脚本要能感知中断类型并响应:
- 执行后检查退出码:
if [ $? -eq 23 ]; then echo "部分文件传输失败,准备续传"; fi(rsync 23 表示IO错误,常见于网络中断) - 检测目标文件是否存在且大小非零:
if [ -s "$DEST_FILE" ]; then echo "检测到部分文件,启用--append-verify"; fi - 超时或重试达上限时,自动切换策略:比如先尝试 rsync 续传 3 次,失败则改用
aria2c -c -s10 -x10分段下载(需提前安装)


















