1

我有七个特定软件的许可证。因此,我想同时开始 7 个工作。我可以使用'&'来做到这一点。现在,“等待”命令等到所有这 7 个进程结束以生成下一个 7 个进程。现在,我想编写 shell 脚本,在我开始前 7 个进程之后,当一个工作完成时我想开始另一个。这是因为这 7 项工作中的一些可能需要很长时间,而另一些则很快就会完成。我不想浪费时间等待他们全部完成。有没有办法在linux中做到这一点?请你帮助我好吗?

谢谢。

4

4 回答 4

5

GNUparallel是要走的路。它设计用于启动同一命令的多个实例,每个实例都具有从stdin外部文件或外部文件检索的不同参数。

假设您的许可脚本被调用myScript,每个实例具有相同的选项--arg1 --arg2并为每个生成的实例采用可变参数--argVariable,这些参数存储在文件中myParameters

cat myParameters | parallel -halt 1 --jobs 7 ./myScript --arg1 --argVariable {} --arg2

说明:

  • -halt 1如果一个工作失败,告诉parallel停止所有工作
  • --jobs 7将启动 7 个实例myScript

在基于 debian 的 linux 系统上,您可以parallel使用以下命令进行安装:

sudo apt-get install parallel

作为奖励,如果您的许可证允许,您甚至可以告诉parallel在多台计算机中启动这 7 个实例。

于 2012-11-23T22:35:08.253 回答
1

如果少于 7 个,您可以检查当前正在运行的数量并启动更多:

while true; do
    if [ "`ps ax -o comm | grep process-name | wc -l`" -lt 7 ]; then
        process-name &
    fi
    sleep 1
done
于 2012-11-23T22:08:21.097 回答
0

写两个脚本。一个在每次完成时重新启动作业,一个在第一个脚本启动 7 次。

像:

script1:

./script2 job1
...
./script2 job7

script2:

while(...)
  ./jobX
于 2012-11-23T22:07:47.397 回答
0

找到了一个相当不错的解决方案,它是标准发行版的一部分。看这里

于 2013-07-10T09:51:02.767 回答