【发布时间】:2013-11-01 19:33:37
【问题描述】:
我有一个如下所示的 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 的解决方案都不会对我有任何好处。
【问题讨论】:
-
wait是这里的正确答案,但是您的while [ $(ps …最好写成while pkill -0 $KEYWORD…- 使用 proctools...名称仍在运行。 -
我认为这个问题应该重新打开。 “可能重复”的 QA 就是并行运行 有限 个程序。像2-3个命令。然而,这个问题的重点是在例如运行命令。一个循环。 (见“但有 4000 行”)。
-
@VasyaNovikov 你有没有阅读 所有这个问题和副本的答案?此处对这个问题的每一个答案,也可以在重复问题的答案中找到。这正是重复问题的定义。无论您是否在循环中运行这些命令,都完全没有区别。
-
@robinCTS 有交叉点,但问题本身是不同的。此外,链接 QA 上最受欢迎的 6 个答案仅涉及 2 个流程。
-
我建议重新打开这个问题,因为它的答案比链接问题的答案更清晰、更清晰、更好,并且得到更高的评价,尽管它是三年前的。