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

