如何在Bash中按批次并行执行带动态参数的Java Jar程序
Bash脚本实现分组并行执行Java任务(动态补位)
完整解决方案脚本
# 定义包含54个美国州的列表(示例为部分州,实际替换为完整54个条目) states=( USA+TX USA+CA USA+TN USA+AB USA+NY USA+FL USA+IL USA+OH USA+PA USA+AZ USA+NC USA+MI # ... 补充剩余42个州 ) # 配置参数:每组实例处理的州数量、最大并行实例数 GROUP_SIZE=4 MAX_PARALLEL=4 # 初始化分组容器与进程计数器 current_group=() process_count=0 for state in "${states[@]}"; do current_group+=("$state") # 当分组满额,或遍历到最后一个州时启动任务 if [ ${#current_group[@]} -eq $GROUP_SIZE ] || [ "$state" = "${states[-1]}" ]; then # 将分组转为逗号分隔的参数格式 localities=$(IFS=,; echo "${current_group[*]}") # 后台启动Java任务 java -jar test-execute.jar --localities="$localities" & ((process_count++)) current_group=() # 达到最大并发数时,等待任意一个进程完成再继续 if [ $process_count -ge $MAX_PARALLEL ]; then wait -n ((process_count--)) fi fi done # 等待所有剩余后台进程执行完毕 wait
关键逻辑说明
- 分组处理:遍历州列表时,将州逐个加入临时分组,满4个则转为逗号分隔字符串,作为
--localities参数传入Java命令。 - 动态并行控制:用
wait -n监听后台进程,一旦有实例执行完成,立即启动新的分组任务,始终保持最多4个并行实例,最大化16核机器的资源利用率。 - 边界处理:自动处理最后一组不足4个州的情况(54=4×13+2),确保所有州都被处理,无遗漏。
注意事项
- 若不同州的处理时间差异较大,
wait -n会自动优先补位最快完成的进程空位,避免资源闲置。 - 可根据实际硬件配置或任务需求,调整
GROUP_SIZE(单实例处理州数)和MAX_PARALLEL(最大并行数)参数。
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

