GNU Parallel指南

jopen 10年前

GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务。本文简要介绍GNU Parallel的使用。

GNU Parallel

它是什么?

GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入的脚本程序。通常的输入是文件列表、主机列表、用户列表、URL列表或者表格列表;一个计算任务也可以是一个从管道读取的一条命令。GNU Parallel会把输入分块,然后通过管道并行的执行。

如果你会使用xargs和tee命令,你会发现GNU Parallel非常易于使用,因为GNU Parallel具有与xargs一样的选项。GNU Parallel可以替代大部分的shell循环,并且用并行的方式更快的完成计算任务。

GNU Parallel保证它的输出与顺序执行计算任务时是一样的,这样就可以方便的把GNU Parallel的输出做为其它程序的输入。

对于每一行输入,GNU Parallel会把这一行做为参数来运行指定的命令。如果没有给出命令,那么这一行会被当做命令执行。多行输入会并行的运行。GNU Parallel经常被用于替代xargs或者cat | bash。

指南

本教程展示了绝大多数GNU Parallel的功能。旨在介绍GNU Parallel中的一个选项,而非讲解真实世界中使用的例子。花一个小时的时间学习本教程,你会因为它喜欢上命令行。

预备

为了执行本教程中的示例,你首先需要做如下准备:

  • parallel >= version 20130814
    安装最新版:

    (wget -O - pi.dk/3 || curl pi.dk/3/) | bash

    这条命令同时也会安装最新版的指南

    man parallel_tutorial

    本教程的大部分内容同时也兼容旧版本。

  • abc-file
    生成文件:

    parallel -k echo ::: A B C > abc-file

  • def-file
    生成文件:

    parallel -k echo ::: D E F > def-file

  • abc0-file
    生成文件:

    perl -e 'printf “A\0B\0C\0”' > abc0-file

  • abc_-file
    生成文件:

    perl -e 'printf “A_B_C“' > abc-file

  • tsv_file.tsv

    1 生成文件:

    perl -e 'printf “f1\tf2\nA\tB\nC\tD\n”' > tsv-file.tsv

  • num30000
    生成文件:

    perl -e 'for(1..30000){print “$_\n”}' > num30000

  • num1000000
    生成文件:

    perl -e 'for(1..1000000){print “$_\n”}' > num1000000

  • num_%header
    生成文件:

    (echo %head1; echo %head2; perl -e 'for(1..10){print “$\n”}') > num%header

  • 远程执行:ssh免密码登录$SERVER1和$SERVER2
    生成文件:

    SERVER1=server.example.com
    SERVER2=server2.example.net
    最后应该成功运行如下命令:

    ssh $SERVER1 echo works
    ssh $SERVER2 echo works
    使用'ssh-keygen -t dsa; ssh-copy-id $SERVER1'建立环境(使用empty pass phrase)