You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在rsync出现特定stderr错误时立即终止并重启任务

解决rsync遇特定错误立即重启的问题

我明白你的需求——原来的循环会等rsync把所有剩余文件的错误都报完才重启,你想要一碰到那个「Transport endpoint is not connected (107)」错误就立刻终止当前rsync进程,马上重启新的任务对吧?

这里有两种实用方案,你可以根据场景选择:

方案一:逐行监控输出,精准终止进程

这个方案会实时读取rsync的输出,一旦捕获到目标错误,立刻终止对应的rsync进程,避免无效的后续错误输出:

while :; do
    # 启动rsync,合并标准输出和错误输出,同时保留终端显示
    rsync -rLvz --size-only --ipv4 --progress source target 2>&1 | tee /dev/tty | while read -r line; do
        # 检查当前行是否包含目标错误信息
        if echo "$line" | grep -q "rsync: send_files failed to open.*Transport endpoint is not connected (107)"; then
            echo "⚠️  检测到传输端点连接错误,正在终止当前rsync进程..."
            # 精准杀死当前rsync进程($PPID指向read进程的父进程,即rsync)
            kill "$PPID"
            break
        fi
    done
    # 等待进程完全退出后再启动新的rsync
    wait
done

逻辑说明:

  • 2>&1:把rsync的错误输出重定向到标准输出,确保我们能捕获到错误信息
  • tee /dev/tty:保证你在终端上仍能看到rsync的正常进度输出,不会因为管道丢失内容
  • while read -r line:逐行读取输出内容,实时监控错误
  • kill "$PPID":精准终止当前运行的rsync进程,不会误杀其他同命令的进程

方案二:简洁匹配,快速触发重启

如果不需要逐行监控细节,也可以用更简洁的写法,通过grep的返回值判断是否触发重启:

while :; do
    # 运行rsync并监控输出
    rsync -rLvz --size-only --ipv4 --progress source target 2>&1 | tee /dev/tty | grep -q "rsync: send_files failed to open.*Transport endpoint is not connected (107)"
    
    # 若grep匹配到错误(返回值为0),则重启rsync
    if [ $? -eq 0 ]; then
        echo "⚠️  检测到关键错误,正在重启rsync..."
        # 杀死当前rsync进程(注意:若有多个同参数rsync进程,可能误杀,谨慎使用)
        pkill -f "rsync -rLvz --size-only --ipv4 --progress source target"
    fi
done

注意事项:

  • 方案二的pkill可能误杀其他参数完全相同的rsync进程,若同时运行多个同任务,优先选方案一
  • 记得将脚本中的source和target替换为你实际的路径,也可以改成变量提升灵活性
  • 若后续修改rsync的命令参数,需同步更新监控的匹配字符串或pkill的规则

内容的提问来源于stack exchange,提问作者David Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:27