Linux并行作业执行工具GNU Parallel怎么用
导读:本文共11836.5字符,通常情况下阅读需要39分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入的脚本程序。通常的输入是文件列表、主机列表、用户列表、URL列表或者表格列表;一个计算任务也可以是一个从管道读取的一条命令。1、parallel 用法简介Usage:parallel[options][comm... ...
目录
(为您整理了一些要点),点击可以直达。GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入的脚本程序。通常的输入是文件列表、主机列表、用户列表、URL列表或者表格列表;一个计算任务也可以是一个从管道读取的一条命令。
GNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe)。
当然,若不想像上面那样进行组合,可使用--xapply
参数从每一个源获取一个参数(或文件一行),这个参数有些类似R中的函数,具有广播作用——如果其中一个输入源的长度比较短,它的值会被重复。
GNU Parallel可以通过--arg-sep
和--arg-file-sep
指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占用的时候会特别有用。
GNU Parallel默认把一行做为一个参数:使用 \n 做为参数定界符。可以使用 -d 改变:
GNU Parallel支持通过-E
参数指定一个值做为结束标志:
GNU Parallel使用 --no-run-if-empty
来跳过空行:
如果parallel之后没有给定命令,那么这些参数会被当做命令:
此外,命令还可以是一个脚本文件,一个二进制可执行文件或一个bash的函数(须用 export -f 导出函数)
GNU Parallel支持多种替换字符串,默认使用 {},使用 -I 改变替换字符串符号 {}。其最常见的字符串替换包括以下几种:{.}
,去掉扩展名;{/}
,去掉路径,只保留文件名;{//}
,只保留路径;{/.}
,同时去掉路径和扩展名;{#}
,输出任务编号。同时对于每一个字符串替换都可以自己指定符号:-I
对应{}
;--extensionreplace
替换 {.}
;--basenamereplace
替换 {/}
;--dirnamereplace
替换{//}
;--basenameextensionreplace
替换 {/.}
;--seqreplace
替换 {#}
。
同时,如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:
使用 --header
把每一行输入中的第一个值做为参数名。
使用 –colsep 把文件中的行切分为列,做为输入参数。
--xargs
会在一行中输入尽可能多的参数(与参数字符串长度有关),通过-s
可指定一行中参数的上限。
为了获得更好的并发性,GNU Parallel会在文件读取结束后再分发参数。 GNU Parallel 在读取完最后一个参数之后,才开始第二个任务,此时会把所有的参数平均分配到4个任务(如果指定了4个任务)。 第一个任务与上面使用 --xargs
的例子一样,但是第二个任务会被平均的分成4个任务,最终一共5个任务。(奇怪的是我的结果与官网教程的结果不一样)
替换字符串可以是输出字符的一部分,使用-m
参数表示每个job不重复输出“背景”(context),-X
则与-m
相反,会重复输出“背景文本”,具体通过下面几个例子进行理解:
使用 -N
限制每行参数的个数,其中-N0
表示一次只读取一个参数,且不输入这个参数(作为计数器来使用)。
如果命令行中包含特殊字符,就需要使用引号保护起来。 perl脚本 ‘print “@ARGV\n”‘ 与linux的 echo 的功能一样。
使用GNU Parallel运行这条命令的时候,perl命令需要用引号包起来,也可以使用-q
保护perl命令:
使用--trim
去除参数两头的空格:
使用--tag
以参数做为输出前缀,使用--tagstring
修改输出前缀:
--dryrun
作用类似于echo:
--verbose
则在运行之前先打印命令:
一般来说,GNU Parallel 会延迟输出,直到一组命令执行完成。使用--ungroup
,可立刻打印输出已完成部分。
使用 --ungroup
会很快,但会导致输出错乱,一个任务的行输出可能会被另一个任务的输出截断。像上例所示,第二行输出混合了两个任务: ‘4-middle’ ‘2-start’。使用 --linebuffer
避免这个问题(稍慢一点):
强制使输出与参数保持顺序 --keep-order/-k
:
GNU Parallel可以把每一个任务的输出保存到文件中,临时文件默认保存在 /tmp 中,可以使用 –tmpdir改变(或者修改 $TMPDIR):
输出文件可以有结构的保存 --results
,输出文件不仅包含标准输出(stdout)也会包含标准错误输出(stderr):
在使用多个变量的时候会显示很有用:
使用 –jobs/-j 指定并行任务数。
通过使用 --interactive
在一个任务执行之前让用户决定是否执行。
当job有大量的IO操作时,为避免“惊群效应”,可使用--delay
参数指定各个job开始的时间间隔。
若已知任务超过一定时间未反应则为失败则可以通过--timeout
指定等待时间避免无谓的等待。GNU parallel能计算所有任务运行时间的中位数,因此可以指定时间为中位数的倍数关系。
GNU parallel有多种方式可用来动态的显示任务进度信息,如:
使用--joblog
参数能够生成各个任务的日志文件:
通过--resume-failed
参数可以重新运行失败的任务; --retry-failed
的作用与--resume-failed
类似,只是--resume-failed
从命令行读取失败任务,而--retry-failed
则是从日志文件中读取失败任务:
GNU parallel支持在某一情况下(如第一个失败或成功时,或者20%任务失败时)终止任务,终止任务又有两种类型,其一为立即终止(通过--halt now
指定),杀死所有正在运行的任务并停止生成新的任务,其二为稍后终止(通过--halt soon
指定),停止生成新任务并等待正在运行任务完成。
GNU parallel还支持在任务失败后重试运行--retries
:
关于终止信号的高级用法参考官方入门文档。
GNU parallel能够在开始一个新的任务前检查系统的负载情况防止过载(通过--load
可指定负载),同时还能检查系统是否使用了交换空间(swap)(通过--noswap
限制使用swap)。
同时,对于某些占用内存较多的程序,parallel会检查内存只有内存满足时才启动任务(通过--memfree
指定需要内存大小),而且在启动任务后内存不够50%时会杀掉最新开始的任务,直到这个任务完成再重新开始那些杀死的任务。
还可以通过--nice
来指定任务的优先级。
可使用-S host
来进行远程登陆: parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件传输使用的是rsync。
更多远程操作参见入门文档。
--pipe
参数使得我们可以将输入(stdin)分为多块(block),然后分配给多个任务多个cpu以达到负载均衡,最后的结果顺序与原始顺序一致。使用--block
参数可以指定每块的大小,默认为1M。
如果不关心结果顺序,只想要快速的得到结果,可使用--round-robin
参数。没有这个参数时每块文件都会启动一个命令,使用这个参数后会将这些文件块分配给job数任务(通过--jobs
进行指定)。若想分配更为均匀还可同时指定--block
参数。
Linux并行作业执行工具GNU Parallel怎么用的详细内容,希望对您有所帮助,信息来源于网络。