我有一个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内置:

process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait

对于上面的例子,4个进程process1...process4将在后台启动,shell将等待这些操作完成后再启动下一组.

GNU manual人中:

wait [jobspec or pid ...]

等待每个进程ID pid或作业(job)规范jobspec指定的子进程退出,并返回最后一个进程的退出状态

Linux相关问答推荐

如何根据具体情况打印两行输出?

Arch_prctl的用例是什么

Linux-如何区分目录中名称相同但扩展名不同的所有文件

运行系统命令失败,但相同的命令可以直接在 bash 中执行

Linux:用户态线程在执行系统调用时是否有更高的优先级?

在 Rust 中重命名主线程

如何从 AWK 中的 CSV 列中获取中值? (Linux)

8 个半小时范围的 Crontab 表达式

将文件的一部分插入到另一个文件的特定位置

如何使用 Bash 将随机数据块写入文件

另一个远程的 Git 合并分支

在 Bash 中从最后到第一个输出文件行

如何在 shell 脚本中只读取一个字符

是否可以在 Linux x86 GAS 程序集中创建没有系统调用的线程?

如何在 Linux 中命名线程?

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

如何在第一个错误时停止 xargs?

如何在 Linux 中使用单行命令获取 Java 版本

初学者如何在 Linux 中开始使用 Mono?

Linux cmd 在 jar 中搜索类文件,而不考虑 jar 路径