当前位置: 首页 > 面试题库 >

Bash脚本并行处理有限数量的命令

云文栋
2023-03-14
问题内容

我有一个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将在后台启动,并在外壳会等到这些都开始下一组之前完成。

从GNU手册:

wait [jobspec or pid ...]

等待直到由每个进程ID
pid或作业规范jobspec指定的子进程退出,并返回等待的最后一条命令的退出状态。如果给出了作业说明,则将等待作业中的所有过程。如果未提供任何参数,则将等待所有当前活动的子进程,并且返回状态为零。如果jobspec和pid均未指定外壳的活动子进程,则返回状态为127。



 类似资料:
  • 本文向大家介绍处理Shell脚本中带有空格的变量(bash脚本),包括了处理Shell脚本中带有空格的变量(bash脚本)的使用技巧和注意事项,需要的朋友参考一下 本篇主要介绍bash脚本中对于含空格文件处理方式。 在批量处理音频文件时候使用下面的脚本发现含有空格的文件名并不能被处理; 通过set -x将执行信息打印出来,发现可以执行到,但是执行过程提示找不到对应的文件名,mv对应的source文

  • 问题内容: PHP必须正确地转义任何可能引起问题的字符。为BASH模仿此功能的最佳方法是什么? 无论如何,有使用bash做准备好的mysql语句吗?这似乎是最好的方法。 我的大多数变量都不会(不应)具有特殊字符,但是我为用户提供了完全自由的密码密码。它可能包含’和’之类的字符。 我可能正在执行多个SQL语句,所以我想创建一个包含参数并随后运行该语句的脚本。这是我到目前为止的内容: doSQL.sh

  • 问题内容: 我该如何使用子流程模块运行bash脚本,必须为此提供几个参数? 这是我目前正在使用的: bash脚本似乎没有接受任何参数。非常感谢您提供任何见解! 问题答案: 将参数作为列表传递,请参阅docs中的第一个代码示例: 如果不是字符串;在传递到:之前将其转换为字符串。

  • 问题内容: 我正在尝试使用命令记录bash会话。 该命令是从bash脚本开始执行的,但是一旦执行,bash脚本就会终止。 我尝试使用各种组合来始终以相同的结果调用命令(调用该命令后立即终止bash脚本)。我得到的输出如下: 我也尝试过最后用a来调用命令,但是再次失败了。 谁能告诉我如何从bash脚本调用命令? 谢谢 问题答案: 您的Shell脚本没有终止。它仍在运行。您会收到提示,因为正在生成新的

  • 我试图从一个简单的BASH脚本执行一个简单的PHP脚本。这个网站上的答案不能回答我的问题。 这是我的BASH脚本 这是我的PHP脚本 从命令行运行BASH脚本时,出现以下错误。 我试过键入/usr/bin/php-q/home/username/subfolder/durable2。这很好。它跑起来了

  • 当我试图登录本地postgres数据库并提交查询时,我的BASH脚本中的psql命令遇到了问题。我以以下方式使用该命令: 但是,我收到以下错误消息。 PSQL: FATAL:用户"postgres"的身份验证失败 在我将以下更改附加到 /var/lib/pgsql/data/pg_hba.conf后,从命令行运行非常好: 本地所有信任 托管所有127.0.0.1/32信任 另外,能否验证一下这一点