如何在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