如何在Linux或Unix下的bash shell中并行运行命令或代码

时间:2020-01-09 10:39:38  来源:igfitidea点击:

如何在Linux或类似Unix的操作系统下运行的bash shell脚本中并行运行命令?
如何从bash脚本并行运行多个程序?
您可以使用各种选项在Linux或类似Unix的系统上并行运行程序或命令

  • 使用GNU/parallel或xargs命令。

  • 使用带有&的wait内置命令。

  • 使用xargs命令。

该页面显示了如何在Linux/Unix系统上运行的bash shell中并行运行命令或代码。

将工作放在后台

语法为:

command &
command arg1 arg2 &
custom_function &

或者

prog1 &
prog2 &
wait
prog3

在上面的代码示例中,prog1和prog2将在后台启动,并且shell程序将等到它们完成后再启动下一个名为progr3的程序。

例子

在以下示例中,在后台运行sleep命令:

$ sleep 60 &
$ sleep 90 &
$ sleep 120 &

要在当前shell会话中显示作业的状态,请运行以下作业命令:

$ jobs

输出示例:

[1]   Running                 sleep 60 &
[2]-  Running                 sleep 90 &
[3]+  Running                 sleep 120 &

让我们编写一个简单的bash shell脚本:

#!/bin/bash
# Our custom function
cust_func(){
  echo "Do something  times..."
  sleep 1
}
# For loop 5 times
for i in {1..5}
do
	cust_func $i & # Put a function in the background
done
 
## Put all cust_func in the background and bash 
## would wait until those are completed 
## before displaying all done message
wait 
echo "All done"

假设您有一个文本文件,如下所示:

$ cat list.txt

输出示例:

https://server1.theitroad.local/20160406_15.jpg
https://server1.theitroad.local/20160406_16.jpg
https://server1.theitroad.local/20160406_17.jpg
https://server1.theitroad.local/20160406_14.jpg
https://server1.theitroad.local/20160406_18.jpg
https://server1.theitroad.local/20160406_19.jpg
https://server1.theitroad.local/20160406_20.jpg
https://server1.theitroad.local/20160406_22.jpg
https://server1.theitroad.local/20160406_23.jpg
https://server1.theitroad.local/20160406_21.jpg
https://server1.theitroad.local/20160420_15.jpg
https://server1.theitroad.local/20160406_24.jpg

要使用wget并行下载所有文件:

#!/bin/bash
# Our custom function
cust_func(){
  wget -q ""
}
 
while IFS= read -r url
do
        cust_func "$url" &
done < list.txt
 
wait
echo "All files are downloaded."

GNU并行示例,可在bash shell中并行运行命令或代码

GNU parallel是一种Shell工具,用于使用一台或多台计算机并行执行作业。
作业可以是单个命令,也可以是必须为输入中的每一行运行的小脚本。
典型的输入是文件列表,主机列表,用户列表,URL列表或表列表。

语法非常简单:

parallel ::: prog1 prog2

例如,您可以找到所有* .doc文件,并使用以下语法对其进行gzip(压缩):

$ find . -type f -name '*.doc' | parallel gzip --best
$ find . -type f -name '*.doc.gz'

在Linux上并行安装GNU

在Debian或Ubuntu Linux上使用apt命令/apt-get命令:

$ sudo apt install parallel

对于RHEL/CentOS Linux,请尝试使用yum命令:

$ sudo yum install parallel

如果您使用的是Fedora Linux,请尝试dnf命令:

$ sudo dnf install parallel

例子

我们上面的wget示例可以使用GNU parallel进行简化,如下所示:

$ cat list.txt | parallel -j 4 wget -q {}

或者

$ parallel -j 4 wget -q {} < list.txt