Linux Parallel 简单用法parallel是一个Linux命令行并行工具(mac也可以用)
这里只说一种简单的用法,基本上能满足日常工作需求,
假设当前目录有三个 *.txt 文件,我们使用gzip对着三个文件进行压缩
1.顺序执行语句:
2.parallel并行版本
3.读取命令版本
linux怎么用一步命令实现多个脚本并行执行?(run1.sh ) ; (run2.sh ) ; (run3.sh)
如果还有继续加
Linux shell编程问题(并行语句)恩,我也试了下,说说我的看法,
3 (tableau_OS[2]=${tableau_OS[1]})(tableau_OS[1]=${tableau_OS[2]})
注意到两个赋值语句都有小括号,这在shell的执行过程中会单独看一个子shell来运行这两个赋值,但需要注意这两个赋值对父shell没有影响,也就是说tableau_OS[1],tableau_OS[2]的值在父shell中并没有改变,为了证明这一点 , 可以写下面这个脚本运行
#!/bin/sh
a=1
(a=2)
echo $a
结果输出为1 。所以3的输出结果是对的
4.tableau_OS[2]=${tableau_OS[1]}tableau_OS[1]=${tableau_OS[2]}如果你想表达并的意思,我觉得应该用而不是,若用的输出结果为
Linux Windows Windows Linux~freeBSD
单独一个是把命令放入后台执行的意思,而非并的意思,这样的话也能解释你的那个输出结果 , 因为赋值被放入后台,并不能把赋值返回父shell,所以相当于只执行了tableau_OS[1]=${tableau_OS[2]}
希望对你有帮助
Linux下的并行神器——parallelGNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe) 。
当然linux命令并行,若不想像上面那样进行组合 , 可使用 --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个任务 。(奇怪的是linux命令并行我的结果与官网教程的结果不一样)
替换字符串可以是输出字符的一部分,使用 -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 参数 。
参考:
官方文档
GNU Parallel指南
linux怎样并行starccm1:Linux A文件写入B文件部. B 写入尾部知道写入部...sed命令貌似支持行行输入处理文件呢... 2:帮导师做课题候发现软件Linux处理速度越越慢举例咱做模拟接——所刚始1钟能处理化合物10钟100钟....泪目 应该啊程序越越慢呢——明明整电脑没啥其操作...
【linux命令并行 linuxshell并行执行】关于linux命令并行和linuxshell并行执行的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 新媒体如何做好推广,新媒体推广思路
- gsm网络优化毕业设计,gsm网络优化报告
- cpu导热硅脂用什么可以代替,cpu导热硅脂导电吗
- linux命令面试题 linux命令面试题及答案
- 电脑卡怎么设置最快,电脑卡怎么弄
- 电脑玩游戏时如何回到桌面,电脑玩游戏怎么回到桌面
- 如何把小程序放到支付宝首页显示,如何把小程序放到支付宝首页显示出来
- php怎么建后台数据库 php加数据库
- sqlserver有客户端服务端之分,sql服务器用户分为哪两种