2017-01-17 13 views
0

私はいくつかのpythonプログラムを実行するシェルスクリプトを実行しています。シェルスクリプトは次のようなものです:Pythonを実行している間にシェルスクリプトをブロックする方法は?

(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 &); 

私が期待するのは、最初の3つのcmd行が実行され、最初の3つが終了した後です。 3つの第2のグループが始まる。しかし、今では9つのプログラムがすべて同時に開始されています。

私はCプログラムを実行する場合は、シェルスクリプトのこの種のは、このように、うまく機能:

(./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 &); 

9本のCMDラインは三つのグループに実行されます。第2のグループは、第1のグループが終了するまで待機する。

+0

なぜこの質問に 'Python'タグを追加しましたか?この質問はどのようにPythonに関係していますか? –

+0

私はC \ C++を書いたので、このシェルスクリプトは期待どおりに機能します。 – Zhao

+0

さて、C/C++スクリプトではうまくいかなかったと思います。 [@ codeforesterの回答](http://stackoverflow.com/a/41690840/2063361)をチェックしてください。スクリプトの言語に依存しません –

答えて

2

各コマンドの後に末尾の&のバックグラウンドですべてのコマンドを実行しています。そのため、コマンドは並行して実行されており、順番に実行されていません。

(./myprogram 0.1 0.1 0.1; 
./myprogram 0.1 0.1 0.1; 
./myprogram 0.1 0.1 0.1;) & 

するか、あなたがそれらをバックグラウンドで実行したくない場合は完全に&を残す:

あなたは順番に、このようにそれらを呼び出すことができます。その場合、あなたは()も必要ないし、それはまたあなたにサブシェルを保存するでしょう。

4

一連のコマンドが完了するのを待つ場合は、そのコマンドがあります。 waitという名前です:

#!/bin/sh 
cmd1 & 
cmd2 & 
cmd3 & 
wait 
cmd4 & 
cmd5 & 
cmd6 & 
wait 

、並行して最初の3つのコマンドを実行し、それらが終了するのを待ってから、次の3つを実行すること。カッコで物をグループ化する必要はありません。明確にするために、より簡単なスクリプトのバージョンは次のようになります。

#!/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 
関連する問題