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
相关产品推荐
相关产品推荐

