并行运行shell脚本

我有一个shell脚本

  1. 洗牌一个大文本文件(600万行6列)
  2. 根据第一列对文件进行sorting
  3. 输出1000个文件

所以伪代码看起来像这样

file1.sh #!/bin/bash for i in $(seq 1 1000) do Generating random numbers here , sorting and outputting to file$i.txt done 

有没有办法来parallel运行这个shell脚本来充分利用多核CPU?

在这一刻, 。 /file1.sh以1到1000的顺序执行,速度非常慢。

谢谢你的帮助。

Solutions Collecting From Web of "并行运行shell脚本"

检查bash subshel​​l ,这些可以用来并行运行脚本的部分。

我没有测试过,但这可能是一个开始:

 #!/bin/bash for i in $(seq 1 1000) do ( Generating random numbers here , sorting and outputting to file$i.txt ) & if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells. done wait 

另外一个非常方便的方法是使用gnu并行 ,如果你还没有安装它,那么这是非常值得的。 如果任务不一定花费相同的时间,这是非常宝贵的。

 seq 1000 | parallel -j 8 --workdir $PWD ./myrun {} 

将启动./myrun 1 ,./ ./myrun 2等,确保一次8个作业正在运行。 如果你想一次在多个节点上运行,也可以使用节点列表,例如在PBS作业中; 我们向用户提供的指导如何在我们的系统上完成。

更新后添加:你要确保你使用的是gnu-parallel,而不是moreutils包中相同名字的更多限制效用( 这里描述了两者的不同历史)。

为了让事情平行运行,你可以在shell命令的末尾使用'&'在后台运行它,然后wait默认(即没有参数),等到所有的后台进程完成。 所以,也许10个并行,然后等待,然后再做10个。 您可以使用两个嵌套循环轻松完成此操作。

有一个程序的完整列表 ,可以在shell中并行运行任务,甚至可以在GNU并行的文档中进行比较。 那里有很多很多的解决方案。 另一个好消息是,它们在调度作业时可能非常有效,以便所有内核/处理器始终处于繁忙状态。

有一个简单的,便携式的程序,为你做这个: PPSS 。 PPSS会自动为您安排作业,通过检查有多少个核心可用,并在每次刚刚完成另一个作业时启动另一个作业。

生成随机数很容易。 假设你有一个像商店数据库一样的巨大文件,你想在某些特定的基础上重写该文件。 我的想法是计算核心数量,拆分成多少个核心文件,制作一个script.cfg文件,split.sh和recombine.sh split.sh将拆分多少核心文件,clone script.cfg(改变东西的脚本在这个庞大的文件中),在多少个核心中克隆script.cgf,使它们可执行,在克隆中搜索和替换一些变量,这些变量必须知道在克隆完成时要在后台处理和运行它们的文件的哪一部分生成一个克隆$ core.ok文件,所以当所有的克隆完成后,会告诉一个循环,只有当所有的.ok文件生成时,才能将部分结果重新组合成一个单一的结果。 它可以用“等待”来完成,但我喜欢我的方式

http://www.linux-romania.com/product.php?id_product=76看看底部,在这样的EN部分翻译,我可以在2分钟(四核心),而不是8 (单核)你必须关心CPU温度,因为所有内核都在100%运行