如何在几个作业中运行shell脚本

时间:2013-02-08 11:30:26

标签: shell unix

我有一个构建脚本,它运行得非常慢,特别是在Solaris上。我希望通过在多个作业中运行来提高性能。我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

试试GNU Parallel,它很容易使用:

  

GNU parallel是一个shell工具,用于使用一台或多台计算机并行执行作业。作业可以是单个命令,也可以是必须为输入中的每一行运行的小脚本。典型的输入是文件列表,主机列表,用户列表,URL列表或表列表。作业也可以是从管道读取的命令。然后,GNU parallel可以拆分输入并将其并行输入命令。

     

如果今天使用xargs和tee,你会发现GNU parallel非常容易使用,因为GNU parallel被编写为具有与xargs相同的选项。如果你在shell中编写循环,你会发现GNU parallel可以替换大多数循环并通过并行运行多个作业来使它们运行得更快。

     

GNU parallel确保命令的输出与您按顺序运行命令时的输出相同。这使得可以使用GNU parallel的输出作为其他程序的输入。

     

对于每行输入,GNU parallel将以行作为参数执行命令。如果没有给出命令,则执行输入行。几行将并行运行。 GNU parallel通常可以用作xargs或cat的替代品bash中。


您提到它是一个构建脚本。如果您使用命令行实用程序make,则可以使用make's -j<N> option并行构建版本:

  

GNU make知道如何一次执行多个食谱。通常,make一次只执行一个配方,等待它在执行下一个配方之前完成。但是,' - j'或'--jobs'选项告诉make同时执行许多配方。

此外,还有distcc可与make一起使用,以便将编译分发到多个主机:

export DISTCC_POTENTIAL_HOSTS='localhost red green blue'
cd ~/work/myproject; 
make -j8 CC=distcc

答案 1 :(得分:2)

GNU并行非常好。 @Maxim - 好建议+1。

对于一次性,如果您无法安装新软件,请尝试这样做一个必须运行多次的慢命令,运行slowcommand 17次。改变一些东西以满足您的需求:

#!/bin/bash
cnt=0

while [ $cnt -le 17  ]    # loop 17 times
do
   slow_command  &
   cnt=$(( $cnt + 1 ))
   [  $(( $cnt % 5 )) -eq  0 ] && wait  # 5 jobs at a time in parallel 
done
wait      # you will have 2 jobs you di not wait for in the loop 17 % 5 == 2