我有七个特定软件的许可证。因此,我想同时开始 7 个工作。我可以使用'&'来做到这一点。现在,“等待”命令等到所有这 7 个进程结束以生成下一个 7 个进程。现在,我想编写 shell 脚本,在我开始前 7 个进程之后,当一个工作完成时我想开始另一个。这是因为这 7 项工作中的一些可能需要很长时间,而另一些则很快就会完成。我不想浪费时间等待他们全部完成。有没有办法在linux中做到这一点?请你帮助我好吗?
谢谢。
我有七个特定软件的许可证。因此,我想同时开始 7 个工作。我可以使用'&'来做到这一点。现在,“等待”命令等到所有这 7 个进程结束以生成下一个 7 个进程。现在,我想编写 shell 脚本,在我开始前 7 个进程之后,当一个工作完成时我想开始另一个。这是因为这 7 项工作中的一些可能需要很长时间,而另一些则很快就会完成。我不想浪费时间等待他们全部完成。有没有办法在linux中做到这一点?请你帮助我好吗?
谢谢。
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 个实例。
如果少于 7 个,您可以检查当前正在运行的数量并启动更多:
while true; do
if [ "`ps ax -o comm | grep process-name | wc -l`" -lt 7 ]; then
process-name &
fi
sleep 1
done
写两个脚本。一个在每次完成时重新启动作业,一个在第一个脚本启动 7 次。
像:
script1:
./script2 job1
...
./script2 job7
和
script2:
while(...)
./jobX