如何在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
相关产品推荐
相关产品推荐

