GNU parallel

维基百科,自由的百科全书
(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)
跳转到导航 跳转到搜索
Parallel
File:Gnu-parallel.svg
开发者GNU计划
当前版本20220322[1](2022年3月22日,​4年前​(2022-03-22
源代码库
  • {{URL|example.com|可选的显示文本}}
Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
编程语言Perl
引擎
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    操作系统Linux和其他类Unix操作系统
    类型实用工具
    许可协议GPLv3

    GNU parallel是用于Linux和其他类Unix操作系统的命令行驱动的实用工具,它允许用户并行的执行shell脚本。GNU parallel是Ole Tange用Perl写的自由软件。它可在GPLv3条款下获得[2]。GNU parallel可以在远程服务器上运行作业,它使用ssh与远程机器进行通信。

    用法[编辑]

    最常用的用法是替代shell循环,比如将

        for x in $(cat list); do 
            do_something "$x"
        done | process_output
    

    变为如下形式:

        cat list | parallel do_something | process_output
    

    这里的文件list包含给do_something的实际参数,而这里的| process_output可以省略。

    使用parallel的脚本通常比使用pexec的脚本易读。

    程序parallel的特征还有:

    • 聚组标准输出标准错误输出,parallel延期输出直到所有运行作业完成;
    • 可保持输出的次序同于输入的次序;
    • 恰当的处理包含特殊字符的文件名,比如空格、单引号、双引号、&(ampersand)和UTF-8编码字符;

    作为缺省,parallel并行运行作业的数量同于CPU核心数目。

    例子[编辑]

     find . -name "*.foo" | parallel grep bar
    

    上述命令是如下命令的并行等价:

     find . -name "*.foo" -exec grep bar {} +
    

    它在当前目录及其子目录中的名字结束于.foo的所有文件中查找字符串bar的出现。parallel将如期运行除非遇到名字包含换行的文件。为了避免这个限制可以使用:

     find . -name "*.foo" -print0 | parallel -0 grep bar
    

    上述命令使用空字符来分隔文件名。

     find . -name "*.foo" | parallel -X mv {} /tmp/trash
    

    上述命令使用{}来告知parallel{}替代为实际参数列表。

     find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media
    

    上述命令所做同于:

     cp -v -p *.ogg /home/media
    

    但是,使用find/parallel/cp的前者命令更加有效利用资源,并且在*.ogg展开后对于shell而言太大的情况下不作为错误而停止。

    参见[编辑]

    引用[编辑]

    1. ^ Tange, Ole. GNU Parallel 20220322 ('Маріу́поль'). parallel (邮件列表). 2022-03-22 [2022-03-22]. (原始内容存档于2022-04-04). 
    2. ^ GNU Parallel. GNU.org. [2021-02-06]. (原始内容存档于2021-02-01). 

    外部链接[编辑]