Bash中如何根据长运行命令的结果执行退出或重试
Shell长任务重试逻辑优化方案
核心需求
监控无法修改的long_running_command函数输出:
- 输出包含
result='good'时,打印WOW后直接返回 - 输出包含
result='failed'时,立即终止重试,打印NAY后报错退出 - 输出暂未返回上述两种明确结果时,持续重试直到达到最大重试上限,达到上限后打印NAY退出
原有代码问题
原逻辑仅通过grep匹配成功标识,未捕获命令完整输出做失败判断,即使命令已经返回failed结果,也会被判定为“暂未匹配到good”继续无意义重试;同时原重试计数逻辑存在边界错误,初始值与循环判断条件不匹配,实际重试次数和预期不符。
修复后完整代码
#!/bin/bash MAX_TRY=5 # 注意:该函数为不可修改的外部长耗时命令,以下逻辑仅做模拟 long_running_command() { wait_time=$(shuf -i 1-5 -n 1) sleep "$wait_time" if [ "$path" -eq 1 ];then echo "result='good'" elif [ "$path" -eq 0 ];then echo "result='failed'" else echo "This path should never hit" fi } # 外部不可控条件模拟:0为失败,1为成功 path=$(shuf -i 0-1 -n 1) check_result() { local try_count=0 while [ $try_count -lt $MAX_TRY ];do # 暂存命令完整输出,避免重复执行命令导致结果偏差 local cmd_output cmd_output=$(long_running_command) # 匹配成功结果,立即退出 if echo "$cmd_output" | grep -qE 'result.*good' ;then echo "$(date): WOW" return 0 fi # 匹配失败结果,立即终止重试直接报错 if echo "$cmd_output" | grep -qE 'result.*failed' ;then echo "$(date): NAY" return 1 fi # 未命中明确结果,继续重试 try_count=$((try_count + 1)) echo "$(date): Retrying... no clear good/failed result returned, tried $try_count/$MAX_TRY" done # 达到重试上限仍无明确结果 echo "$(date): NAY" return 1 } check_result
关键逻辑说明
- 每次执行长耗时命令时,先将完整输出存入临时变量,避免多次调用命令产生不一致的返回结果
- 按优先级判断返回结果:先匹配成功标识,再匹配失败标识,只要命中任意一种明确结果就立刻终止循环
- 仅当输出不包含good/failed两种明确标识时,才会计数并重试,重试次数达到
MAX_TRY后直接退出返回错误 - 全程未修改
long_running_command的内部实现,符合使用约束
内容的提问来源于stack exchange,提问作者monk
相关产品推荐
相关产品推荐

