2017-05-01 16 views
0

自分のMakefileを構造化して、シェルスクリプトを望む順番で実行する際に問題があります。Makefileと並行してタスクを実行する

は、ここに私の現在のメイク

## Create data splits 
raw_data: src/data/get_data.sh 
    src/data/get_data.sh 
    hadoop fs -cat data/raw/target/* >> data/raw/target.csv 
    hadoop fs -cat data/raw/control/* >> data/raw/control.csv 
    hadoop fs -rm -r -f data/raw 
    touch raw_data_loaded 

split_data: raw_data_loaded 
    rm -rf data/interim/splits 
    mkdir data/interim/splits  
    $(PYTHON_INTERPRETER) src/data/split_data.py 

## Run Models 
random_forest: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/random_forest.py > random_forest & 

under_gbm: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/undersampled_gbm.py > under_gbm & 

full_gbm: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/full_gbm.py > full_gbm & 

# Create predictions from model files 
predictions: random_forest under_gbm full_gbm 
    nohup $(PYTHON_INTERPRETER) src/models/predictions.py > predictions & 

問題私は##Run Modelsセクションを開始するまで

すべてがうまく動作です。これらはすべて独立したスクリプトであり、一度実行するとsplit_dataが終了します。 3つのモデルスクリプトを同時に実行したいので、それぞれをバックグラウンドで&で実行します。

私の最後の仕事であるpredictionsが先行する3つのタスクと同時に起動してしまうという問題があります。私がしたいことは、3つの同時モデルスクリプトが終了し、predictionsが実行されていることです。それが終了するまで実行されませんpredictionsよう

私の試み

私の提案された解決策は、&せずに私の最終的なモデルのタスク、full_gbmを実行することです。これはうまくいくはずですが、これを達成するためのヒッピーな方法がないのだろうか?同じ結果を達成するためにターゲット変数を構成する方法はありますか?

答えて

1

あなたは、使用しているMakeの実装については言及していません。 GNU Makeの場合は、-jオプションを指定して呼び出すと、どのジョブを並行して実行するかを決めることができます。次に、すべてのコマンドからnohup&を削除できます。 predictionsは、random_forest under_gbm full_gbmのすべてが完了するまで開始されず、predictionsが完了するまでビルド自体は終了しません。

また、コマンドのすべての重要な終了ステータスを失うことはありません。

関連する問題