如何使用Parallel在Shell中并行执行命令

linux

在Bash中没有内置并行或者并发运行命令的方法。顾名思义,GNU Parallel是用于构建并行运行命令的工具。您可以使用不同的参数运行同一命令,无论它们是文件名,用户名,主机名还是从文件读取的行。

GNU Parallel提供了对许多最常见操作(输入行,输入行的各个部分,指定输入源的不同方式等)的简写引用。Parallel可以从输入源替换命令或将命令提供给多个不同的Bash实例。

有时候你执行的命令也许不需要等待上一个命令运行完成之后再运行下一个,因此你可能会想到让这些命令并行或者并发运行,减少你的任务执行时间,或者加快项目构建速度。

在本教程中,简单介绍Parallel命令的常见用法和解释。包括使用apt或者编译安装parallel,禁用学术引用说明的输出,并行执行或者并行多个命令,从标准输入读取参数,parallel代替xargs,并行执行文件中的命令,保证parallel输出的顺序。

安装parallel

安装GNU Parallel的命令有两种方式,第一种时从源码进行编译并安装到系统中。这种方式适用于Linux所有的发行版。第二种适用apt命令安装,仅适用于基于debian发行版。如果你使用的CentOS,Fedora,open suse等基于Redhat的Linux请使用源码编译的方式安装。我们未找到GNU Parallel可用rpm包。

从源码中构建,适用于任何操作系统

我们将从gnu站点中下载parallel tar归档文件,你可以选择从浏览器获取使用wget命令下载parallel的源码。以下命令时使用wget命令下载parallel-latest.tar.bz2归档文件:

wget http://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2

接下来解压缩parallel-latest.tar.bz2归档文件,使用tar命令。你将使用以下命令

tar xjf parallel-latest.tar.bz2

解压缩parallel-latest.tar.bz2归档文件后,所有源码的文件将存在与parallel-latest目录中,使用cd命令切换parallel-latest目录,

cd parallel-latest/

./configure && make

sudo make install

验证parallel安装

要验证GNU parallel的安装,你需要在终端中键入以下命令:

parallel -v

输出如下所示:

Academic tradition requires you to cite works you base your article on.

If you use programs that use GNU Parallel to process data for an article in a

scientific publication, please cite:

Tange, O. (2021, December 22). GNU Parallel 20211222 ('Støjberg').

Zenodo. https://doi.org/10.5281/zenodo.5797028

This helps funding further development; AND IT WON'T COST YOU A CENT.

If you pay 10000 EUR you should feel free to use GNU Parallel without citing.

More about funding GNU Parallel and the citation notice:

https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice

To silence this citation notice: run 'parallel --citation' once.

parallel: Warning: Input is read from the terminal. You are either an expert

parallel: Warning: (in which case: YOU ARE AWESOME!) or maybe you forgot

parallel: Warning: ::: or :::: or -a or to pipe data into parallel. If so

parallel: Warning: consider going through the tutorial: man parallel_tutorial

parallel: Warning: Press CTRL-D to exit.

你需要按CTRL+D退出parallel命令。

在ubuntu/debian/Linux mint等发行版

如果你使用的时基于debian的Linux发行版,你可以选择使用apt安装parallel命令。键入以下apt命令安装parallel

sudo apt-get install parallel

ubuntu/debian

禁用学术引用说明

每次使用parallel执行命令时,你可能会注意到每次都有相同说明在顶部出现。为了有更好的可读性,我们建议你了解学术引用说明后。运行以下命令关闭它:

parallel --citation

输出如何如下所示:

Academic tradition requires you to cite works you base your article on.

......

Type: 'will cite' and press enter.

然后继续键入will cite,接着enter回车。即可关闭学术引用说明。

并行执行多个命令

使用parallel非常简单,只需要在parallel后面连接多个命令,并且使用空格分开,下面命令中将会并行执行ls,echo foo,pwd命令:

parallel -vk  ::: ls 'echo foo' pwd

从标准输入读取参数

在某些情况会使用标准输入读取命令的参数,然后传递给parallel执行。下面是一个简单的示例:

echo 1,2 | parallel  -d, echo {}

在这个示例parallel通过管道从标准输入读取命令的参数,然后将参数传递给后面的echo命令,{}大括号这里将会填充从标准输入中的参数,-d表示使用逗号作为参数分隔符。

命令输出如下所示:

1

2

还有一种常见的用法就是在parallel后面接着需要重复执行的命令。如下所示:

parallel echo ::: A B C

该命令相当于同时执行三次echo命令:

echo A

echo B

echo C

这将并行打印ABC,输出如下

A

B

C

parallel代替xargs

例如,使用gzip替换xargs压缩当前目录及其子目录中的所有以.html作为扩展名的文件:

find . -type f -name '*.html' -print | parallel gzip

如果您需要保留特殊字符(例如文件名中的换行符),请使用find的-print0选项。如你需要了解更多find命令相关的说明,请参阅我们的使用find命令搜索文件教程。

当文件数量太大而无法通过调用一次mv命令移动或者重命名文件时,可以使用Parallel从当前目录移动文件:

find . -depth 1 \! -name '.*' -print0 | parallel -0 -X mv {} destdir

如您所见,{}被替换为从标准输入读取的每一行,destdir时你的目标目录。

GNU Parallel另一种常见的用法是从文件读取行作为参数。假设你有一个文件args.txt,内容如下:

1

2

3

cat list | parallel "echo {};"

上面的命令将会同时打印1,2,3。

Parallel提供了一种内置的机制来删除文件名的扩展名,这使其可以进行批量处理文件的格式转换或重命名:

ls *.gz | parallel -j+0 "zcat {} | bzip2 >{.}.bz2 && rm {}"

这将使用bzip2重新压缩当前目录中所有以.gz结尾的文件,每个CPU核心(-j + 0)运行一个作业。parallel可以从命令行获取参数。以上也可以写成

parallel "zcat {} | bzip2 >{.}.bz2 && rm {}" ::: *.gz

保证parallel输出的顺序

如果要在输出中保留顺序,请将-k选项传递给parallel。例如,以下命令将保持traceroute命令的调用的先后顺序作为输出。

{

echo myfreax.com ;

echo debian.org ;

echo freenetproject.org ;

} | parallel -k traceroute

将确保traceroute myfreax.com首先显示的输出。

并行执行文件中的命令

最后,你也可以使用Parallel并行运行执行文件中的命令。在文件创建一系列shell命令做一些每个命令都独立的任务。此时,如果你使用parallel执行它,将会更快完成你的任务。比如你有一个文件file, 包含一系列shell命令,每行一个,如下所示

echo "a"

echo "b"

file
parallel -j 10 < file

-j选项表示同时执行的任务数,建议使用CPU的核心数。使用nproc命令可以找到CPU的核心数量。

结论

至此,你知道如何使用Parallel命令用法和安装Parallel。比如使用批量重命名文件等。如果你想学习更多Parallel命令的基础,请参考GNU Parallel文档。如你有任何疑问请随时发表评论。

以上是 如何使用Parallel在Shell中并行执行命令 的全部内容, 来源链接: utcz.com/z/507000.html

回到顶部