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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:45:36