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

Linux Shell脚本:如何维持10个并发任务的批量执行(200+脚本)

实现Linux Shell下固定并发数的任务调度方案

这个需求在Shell批量任务调度里太常见了,我给你几个从简单工具到自定义实现的方案,适配不同场景:

1. 用GNU Parallel(最省心的方案)

GNU Parallel就是专门为批量并发任务设计的工具,大部分Linux发行版默认已预装,没装的话用包管理器安装即可(比如apt install parallel或yum install parallel)。

它会自动帮你维持指定的并发数:只要有一个任务完成,立刻启动下一个,始终保持10个任务在运行,用法超级简单:

示例1:直接运行当前目录下所有.sh脚本

parallel -j 10 ::: *.sh

示例2:从列表文件读取脚本路径(适合脚本分散在不同目录的情况)

先把所有要执行的脚本路径写入scripts.txt(每行一个路径),然后运行:

parallel -j 10 < scripts.txt

如果需要把每个脚本的输出单独存到日志文件,方便后续排查问题,可以这样写:

parallel -j 10 --joblog task_logs.log '{} > {}.output.log 2>&1' ::: *.sh

2. 用xargs(系统自带,无需额外安装)

xargs是Linux系统默认自带的工具,通过-P参数可以指定并发数,-n 1表示每次给sh命令传递一个脚本参数:

ls *.sh | xargs -n 1 -P 10 sh

如果你的脚本路径包含空格或特殊字符,建议用find配合-print0和xargs -0避免解析错误:

find /your/script/dir -name "*.sh" -print0 | xargs -0 -n 1 -P 10 sh

xargs的功能比Parallel简单,没有内置的日志和重试机制,但胜在无需额外安装工具,适合快速解决问题。

3. 手动写Shell脚本实现(无依赖,完全自定义)

如果你的环境无法安装额外工具,也可以自己写一个调度脚本,核心逻辑是:维护任务列表,启动任务后放到后台,循环检查当前后台任务数量,低于10个时就启动新任务。

示例脚本:

#!/bin/bash

# 替换成你的脚本列表,也可以从文件读取(比如scripts=($(cat scripts.txt)))
scripts=(script_001.sh script_002.sh ... script_200.sh)
max_concurrent=10

for script in "${scripts[@]}"; do
    # 启动脚本到后台,并重定向输出到日志
    bash "$script" > "${script%.sh}_output.log" 2>&1 &
    
    # 检查当前后台任务数量
    current_jobs=$(jobs -p | wc -l)
    
    # 如果达到并发上限,等待任意任务完成后再继续
    while [ "$current_jobs" -ge "$max_concurrent" ]; do
        sleep 1
        current_jobs=$(jobs -p | wc -l)
    done
done

# 等待最后一批任务全部完成
wait
echo "所有任务执行完毕!"

实用建议

  • 日志管理:不管用哪种方案,都建议把每个脚本的输出重定向到单独的日志文件,避免多任务输出混乱,方便排查问题。
  • 错误监控:如果需要跟踪任务执行状态,可以在脚本内加入错误判断,或者用Parallel的--joblog功能记录所有任务的执行结果。
  • 资源适配:如果脚本消耗CPU/内存较多,建议先测试单脚本的资源占用,再调整并发数,避免系统负载过高。
  • 路径规范:尽量使用绝对路径指定脚本,避免因工作目录变化导致找不到脚本的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:12:42