Bash 脚本并行处理有限数量的命令
- 2024-10-12 10:28:00
- admin 原创
- 72
问题描述:
我有一个如下所示的 bash 脚本:
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
但是处理每一行直到命令完成然后移动到下一行非常耗时,我想例如一次处理 20 行,然后当它们完成后再处理另外 20 行。
我想过wget LINK1 >/dev/null 2>&1 &
将命令发送到后台并继续,但这里有 4000 行,这意味着我将遇到性能问题,更不用说我应该同时启动多少个进程受到限制,所以这不是一个好主意。
我现在想到的一个解决方案是检查其中一个命令是否仍在运行,例如在 20 行之后我可以添加这个循环:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
当然,在这种情况下,我需要将 & 附加到行尾!但我觉得这不是正确的做法。
那么我实际上如何将每 20 行组合在一起并等待它们完成后再转到接下来的 20 行,这个脚本是动态生成的,所以我可以在生成它时对其进行任何我想要的数学运算,但它不必使用 wget,它只是一个例子,所以任何特定于 wget 的解决方案都不会对我有任何好处。
解决方案 1:
使用wait
内置的:
process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait
对于上面的例子,4 个进程process1
...process4
将在后台启动,并且 shell 将等待这些进程完成后再启动下一组进程。
来自GNU 手册:
wait [jobspec or pid ...]
等待每个进程 ID pid 或作业规范 jobspec 指定的子进程退出,并返回等待的最后一个命令的退出状态。如果给出了作业规范,则等待作业中的所有进程。如果没有给出参数,则等待所有当前活动的子进程,返回状态为零。如果 jobspec 和 pid 均未指定 shell 的活动子进程,则返回状态为 127。
解决方案 2:
请参阅parallel。其语法与 类似xargs
,但它并行运行命令。
解决方案 3:
事实上,xargs
它可以为您并行运行命令。有一个特殊的-P max_procs
命令行选项可以实现这一点。请参阅man xargs
。
解决方案 4:
您可以运行20个进程并使用以下命令:
wait
您的脚本将等待所有后台作业完成后再继续。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件