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

如何修改bash脚本实现每次并行6个任务,跑完再处理下一批直到24个完成

解决方案

是否需要将任务列表转为数组

建议转换为数组处理。相较于直接遍历空格分隔的字符串,数组可以更便捷地实现任务的批次切分、下标定位,同时能避免字符串分割时可能出现的边界异常问题,代码可读性和可维护性更高。当然非数组方式也能实现需求,但实现逻辑会更繁琐,容错性更低。

原脚本已知问题修正

在调整并行逻辑前,先修复原有脚本的几个明显错误:

  • 原wait_for_processes函数存在死循环问题:循环内重复将DOINGSTUFF赋值为入参$1,永远无法满足退出条件
  • 原do_this_thing函数内误用未传入的$NUM变量,应该直接取函数入参$1作为后缀
  • curl命令内的THE_NAME变量未添加$标识符,无法正常解析变量值
  • 主流程中调用函数名拼写错误,实际定义的函数名为wait_for_processes,调用时少写了末尾的s

调整后支持6任务批次并行的完整脚本

#!/bin/bash
#Usage: runprocess.sh $1{duhname} $2{name-prefix} $3{'listsofitems'}
DUHNAME=$1
PREFIX=$2
SUFFIXES=$3
# 定义每批并行任务数
BATCH_SIZE=6
# 将后缀列表转为数组
SUFFIX_ARR=($SUFFIXES)
TOTAL_TASK=${#SUFFIX_ARR[@]}

function wait_for_processes {
     # 可根据实际需求选择使用bash内置wait或者原业务轮询逻辑
     # 方案1:直接等待当前所有后台子进程结束,简单高效
     wait
     return 0

     # 方案2:保留原有业务侧轮询逻辑,需要修改死循环问题,示例如下:
     # while true
     # do
     #        sleep 10
     #        DOINGSTUFF=$(bin/grep -i doingstuff | /usr/bin/cut -d '>' -f 2 | /usr/bin/cut -d '<' -f 1 | wc -l)
     #        if [ $DOINGSTUFF -eq 0 ];then
     #            break
     #        fi
     #        sleep 60
     #done
}

function do_this_thing { #suffix
     SUFFIX=$1
     #Call a process to run against each item
     THE_NAME=${PREFIX}${SUFFIX}
     /usr/bin/curl -v -X POST ${THE_NAME}
}

#####        BEGIN MAIN SCRIPT      ############
wait_for_processes
# 按批次遍历任务数组
for ((i=0; i<TOTAL_TASK; i+=BATCH_SIZE))
do
    # 启动当前批次的最多6个任务,后台运行
    for ((j=i; j<i+BATCH_SIZE && j<TOTAL_TASK; j++))
    do
        CURRENT_SUFFIX=${SUFFIX_ARR[j]}
        do_this_thing $CURRENT_SUFFIX &
    done
    # 等待当前批次所有任务执行完成
    wait_for_processes
done
#####        END MAIN SCRIPT      ############

上述脚本默认使用bash内置的wait命令等待后台进程结束,如果你原有业务侧的轮询逻辑是必须的,只需要注释掉方案1的代码,放开方案2的代码即可。

内容的提问来源于stack exchange,提问作者Hd Camper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:45:03