并行运行shell脚本

时间:2011-04-05 05:54:17

标签: linux bash shell unix parallel-processing

我有一个shell脚本

  1. 随机播放一个大文本文件(600万行和6列)
  2. 根据第一列
  3. 对文件进行排序
  4. 输出1000个文件
  5. 所以伪代码看起来像这样

    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次运行并且非常慢。

    感谢您的帮助。

8 个答案:

答案 0 :(得分:85)

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

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

将启动./myrun 1./myrun 2等,确保一次运行8个作业。如果要一次在多个节点上运行,例如在PBS作业中,它也可以采用节点列表;我们对用户如何在我们的系统上执行此操作的说明为here

已更新以添加:您希望确保使用的是gnu-parallel,而不是更多有限的更多限制实用程序,这些实用程序位于moreutils包中(两者的不同历史记录是描述here。)

答案 1 :(得分:42)

签出bash subshells,这些可以用来并行运行部分脚本。

我没有对此进行测试,但这可能是一个开始:

#!/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

答案 2 :(得分:13)

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

答案 3 :(得分:9)

有一个whole list of programs可以在shell中并行运行作业,甚至包括它们之间的比较,在GNU parallel的文档中。那里有很多很多解决方案。另一个好消息是,它们在调度作业方面可能非常有效,因此所有核心/处理器始终处于忙碌状态。

答案 4 :(得分:4)

有一个简单的便携式程序可以为您完成此任务:PPSS。 PPSS会自动为您调度作业,方法是检查可用的核心数量,并在每次完成另一个作业时启动另一个作业。

答案 5 :(得分:0)

byte[]secretKeyByteArray = Convert.FromBase64String(apiKey);

答案 6 :(得分:0)

您可能想看看runprunp是一个简单的命令行工具,可并行运行(shell)命令。当您想一次运行多个命令以节省时间时,这很有用。它是单个二进制文件,因此易于安装。已经在Linux(amd64和arm)和MacOS / darwin(amd64)上进行了测试。

答案 7 :(得分:-2)

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

http://www.linux-romania.com/product.php?id_product=76 看看底部,部分翻译成EN 通过这种方式,我可以在2分钟(四核)而不是8(单核)中获得20000篇16列的文章 您必须关心CPU温度,因为所有核心都在100%运行