并行运行shell脚本

Ton*_*ony 41 unix linux parallel-processing bash shell

我有一个shell脚本

  1. 随机播放一个大文本文件(600万行和6列)
  2. 根据第一列对文件进行排序
  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
Run Code Online (Sandbox Code Playgroud)

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

在这一刻, ./file1.sh按顺序执行1到1000次运行并且速度非常慢.

谢谢你的帮助.

Jon*_*rsi 85

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

seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
Run Code Online (Sandbox Code Playgroud)

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

更新以添加:您希望确保使用gnu-parallel,而不是更多限制的moreutils包中的相同名称的实用程序(这里描述了两者的不同历史.)

  • 如果您的sysadmin不能安装它,那么很容易自己安装:只需将perl脚本'parallel'复制到路径中的目录即可完成.无需编译或安装库. (3认同)

And*_*ahl 42

查看bash子shell,这些子shell可以用来并行运行脚本的一部分.

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

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 如果所有作业完全占用同一时间,则此解决方案效果最佳.如果作业不占用同一时间,则会浪费CPU时间等待其中一个长作业完成.换句话说:它不会在任何时候同时运行10个作业. (5认同)
  • 这将并行启动所有千个任务,这可能导致过多的交换/争用以获得最佳工作吞吐量,但这肯定是一种合理且简单的入门方式. (3认同)

Ton*_*roy 14

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


Eri*_*got 9

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