linux并行执行命令 linux并发执行命令的方式( 二 )


使用-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 参数可以指定每块的大?。衔?M 。

推荐阅读