博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GNU parallel 笔记
阅读量:7074 次
发布时间:2019-06-28

本文共 2724 字,大约阅读时间需要 9 分钟。

GNU parallel 是一个可以并行执行任务的 Shell 工具。它是一个 perl 脚本。本文所有的示例在 Bash 环境中有效。

初次尝试

以前虽然知道有这么个工具,但是一直没想到要用。今天在删除我的 Gentoo 系统的 /usr/src 目录下的旧版本的内核源码目录时用了一次,很好用。

$ cd /usr/src$ ls ls -d linux-*linux-4.8.10-gentoo/  linux-4.8.5-gentoo/  linux-4.8.7-gentoo/linux-4.8.12-gentoo/  linux-4.8.6-gentoo/  linux-4.8.9-gentoo/

linux-4.8.12-gentoo 是我目前正在使用的内核版本的源码,我想只保留它,将其他的源码目录都删掉。这些源码目录中除了包含内核源码文件之外,还包含我编译时产生的中间文件,太占硬盘空间,每个源码目录差不多要用 1.2 GB 的空间。

之前要删,记不起 bash 的 for 循环语法时,就是一个一个的 rm -rf。没忘记 for 的语法时,就这样删:

$ for i in linux-4.8.{5,6,7,8,9,10}-gentoo ; do sudo rm -rf $i ; done

之所以总是忘记 bash 的 for 语法,是因为平时使用的 Shell 是 fish。fish 的 for 语法与 bash 不同。结果,它们两个的 for 语法我都记不住。

对于这种删除文件或目录的特定任务而言,更简单的做法是:

$ sudo rm -rf linux-4.8.{5,6,7,8,9,10}-gentoo

现在用 GNU parallel,就简单多了:

$ sudo parallel rm -rf ::: linux-4.8.{5,6,7,8,9,10}-gentoo

更重要的是,如果 parallel所执行的任务是并行的。对于比较慢的任务,在多核机器上,这是个福音。

如果你没东西可以删,可以试试下面这条对系统无任何危害的命令,体验一下 parallel:

$ parallel echo ::: linux-4.8.{5,6,7,8,9,10}-gentoo

并行生成 povray 动画的各帧

假设 povray 的渲染脚本为 foo.pov,动画配置文件为 foo-{1,2,3,4}.ini。并行执行 4 个 povray 进程,绘制一份被划分为四组的 30 帧画面的动画:

$ parallel povray ::: foo-{1,2,3,4}.ini$ convert -delay 10 -loop 0 foo*.png foo.gif

可用下面的命令制作 povray 命令所需要的 4 份 .ini 文件的内容:

$ cat << EOF > foo.iniCyclic_Animation=onInput_File_Name=foo.povInitial_Frame=1Final_Frame=30Initial_Clock=1Final_Clock=0EOF$ seq 4 | parallel cp foo.ini foo-{}.ini$ parallel --link 'echo Subset_Start_Frame={1} | tee -a foo-{2}.ini' ::: 1 8 15 22 ::: 1 2 3 4$ parallel --link 'echo Subset_End_Frame={1} | tee -a foo-{2}.ini' ::: 7 14 21 30 ::: 1 2 3 4

测试所用的三维模型,在一台四个 CPU 核心的机器上,使用单个 povray 进程,渲染 60 帧,需要 207 秒。将这 60 帧划分为 4 组,然后用 parallel 调用 4 个 povray 进程进行渲染,只需要 92 秒。虽然并行没有预想的那样快,不过鉴于单个 povray 进程在光线跟踪运算过程中用了 2 个线程,若我的机器的 CPU 核心数能有 8 个,那么渲染时间应该能降到 50 秒左右。

povray 动画并行渲染结果

并行下载及 zero 的并行化

这个只是在我们屋里有点用。

$ parallel 'wget http://192.168.0.7:8080/meta-doc/agn_{}.zero' ::: array list points kd_tree bkd_tree$ parallel 'zero -m night -e "agn_{}.h, agn_{}.c" agn_{}.zero' ::: array list points kd_tree bkd_tree

避免两次载入 parallel 进程,上述两条命令可以「叠加」到一起:

$ parallel 'wget http://192.168.0.7:8080/meta-doc/agn_{}.zero ; \            zero -m night -e "agn_{}.h, agn_{}.c"  agn_{}.zero' \            ::: array list points kd_tree bkd_tree

zero 是什么东西,这需要看「」。

shell 的变量与数组的传递

shell 中的变量与数组可通过 env_parallel 传递给 parallel 程序。例如:

$ LOCATION="http://192.168.0.7:8080/meta-doc"$ ZERO_FILES=(array list points kd_tree bkd_tree)$ source `which env_parallel.bash`$ env_parallel 'echo $LOCATION/agn_{}.zero' ::: ${ZERO_FILES[*]}http://192.168.0.7:8080/meta-doc/agn_array.zerohttp://192.168.0.7:8080/meta-doc/agn_list.zerohttp://192.168.0.7:8080/meta-doc/agn_points.zerohttp://192.168.0.7:8080/meta-doc/agn_kd_tree.zerohttp://192.168.0.7:8080/meta-doc/agn_bkd_tree.zero

应该还没有完,待续……

转载地址:http://gekml.baihongyu.com/

你可能感兴趣的文章
5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
查看>>
jQuery学习和知识点总结归纳
查看>>
Permission denied You (root) are not allowed to access to (crontab) because of pam configuration.
查看>>
mybaits出现错误
查看>>
我的友情链接
查看>>
如果项目使用HOLO或加载V7包就会出现小按钮变大
查看>>
kvm虚拟化
查看>>
自制WheelView沉浸式菜单及Dialog样式Activity
查看>>
python-62: BS4的基本知识
查看>>
jsp中文显示乱码的解决办法
查看>>
Cmakelists.txt中间部分模板
查看>>
eclipse中java工程转web工程
查看>>
linux中的僵尸进程
查看>>
clustershell批量执行shell命令
查看>>
fedora 19 安装mp3 解析
查看>>
redhat7.2配置yum源
查看>>
iOS开发之左右抖动效果
查看>>
血的教训---工作中注意的事项(未完)
查看>>
php转义之gpc
查看>>
PHP应用如何对接微信公众号JSAPI支付
查看>>