我正在运行一个执行多个python程序的shell脚本。 shell脚本是这样的:
(python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.3 --uttWindowSize 10 --learningRate 0.0001 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.3 --uttWindowSize 10 --learningRate 0.0003 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.3 --uttWindowSize 10 --learningRate 0.0009 &);
(python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.6 --uttWindowSize 10 --learningRate 0.0001 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.6 --uttWindowSize 10 --learningRate 0.0003 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.6 --uttWindowSize 10 --learningRate 0.0009 &);
(python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.9 --uttWindowSize 10 --learningRate 0.0001 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.9 --uttWindowSize 10 --learningRate 0.0003 &
python3 main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 --dropOut 0.9 --uttWindowSize 10 --learningRate 0.0009 &);
我期望的是前三个cmd行执行以及前三个结束之后。第二组三人开始。但现在所有九个节目都在同一时间开始。
如果我执行一个C程序,这种shell脚本运行良好,如下所示:
(./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 & );
(./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 & );
(./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 &
./myprogram 0.1 0.1 0.1 & );
九个cmd线将分三组执行。第二组将等到第一组结束。
答案 0 :(得分:4)
如果你想等待一组命令完成,那就有一个命令。它名为wait
:
#!/bin/sh
cmd1 &
cmd2 &
cmd3 &
wait
cmd4 &
cmd5 &
cmd6 &
wait
这将并行运行前三个命令,等待它们完成,然后运行接下来的三个命令。没有必要用括号分组。为了澄清,您的脚本的更简单版本可能如下所示:
#!/bin/sh
args() {
printf "%s" "main.py --device /gpu:1 --wordCNNSize 100 --uttCNNSize 100 "
printf "%s" "--dropOut $1 --uttWindowSize 10 --learningRate $2"
}
python3 $(args 0.3 0.0001) &
python3 $(args 0.3 0.0003) &
python3 $(args 0.3 0.0009) &
wait
python3 $(args 0.6 0.0001) &
python3 $(args 0.6 0.0003) &
python3 $(args 0.6 0.0009) &
wait
python3 $(args 0.9 0.0001) &
python3 $(args 0.9 0.0003) &
python3 $(args 0.9 0.0009) &
wait
答案 1 :(得分:2)
您正在执行后台中的所有命令,并在每个命令后跟踪&
。这就是命令并行运行而不是按顺序运行的原因。
你可以这样顺序调用它们:
(./myprogram 0.1 0.1 0.1;
./myprogram 0.1 0.1 0.1;
./myprogram 0.1 0.1 0.1;) &
如果您不希望它们在后台运行,请完全退出&
。在这种情况下,您甚至不需要( )
,这也将为您节省一个子shell。