2016-03-23 47 views
2

私はです。シェルスクリプトには新しく、複数のqsubジョブをサブミットするシェルパイプラインを作成しようとしていますが、これらのqsubs最新の仕事が完了したことを条件にしています。私は、qsubジョブの提出後にシェルスクリプトの処理を続行しようとする複数の方法を研究していますが、どれも成功していません。次のようにPBSのqsub配列ジョブが完了するまで残りのシェルスクリプトコマンドを保持する

私は、問題を説明するために提供することができ、コードの最も簡単なチャンクは次のとおりです。

THREADS=`wc -l < list1.txt` 
qsub -V -t 1-$THREADS firstjob.sh 
echo "firstjob.sh completed" 

あり、実際firstjob.sh仕上げ上の偶発あり、この後のコードの他の行は明らかにされているが、私は省略されています明快にするためにここに示します。

wait 1)すべてのバックグラウンドプログラムが完了するまでスクリプトを停止するはずのwaitのみを使用しています。これは、waitの直後にプッシュし、アレイジョブが実行中のときに端末にechoステートメントを出力しました。私が推測するのは、qsubジョブが提出されてから終了し、waitは完了したと考えているからです。

qsub -V -t 1-$THREADS firstjob.sh 

wait 

echo "firstjob.sh completed" 

2)、変数にジョブの設定ジョブを提出し、その変数をエコー、および一時停止するwaitと共に全体のジョブIDを使用して。 echoコマンドは、配列ジョブのすべての要素が完了するまで待機する必要があります。エラーメッセージは、コードの後に​​コードブロック内に表示されます。

job1=$(qsub -V -t 1-$THREADS firstjob.sh) 
echo "$job1" 

wait $job1 

echo "firstjob.sh completed" 

####ERROR RECEIVED#### 
-bash: wait: `4585057[].cluster-name.local': not a pid or valid job spec 

3)qsubのために-sync yを使用する。これは、ジョブが完了するまで、それがqsubを終了するのを防ぐべきです。効果的な一時停止として機能します...私は望んでいました。コマンドの後にコメントに誤りがあります。何らかの理由で、-syncオプションが正しく読み込まれていませんか?私は、スクリプトを一時停止するqsub-W depend=afterok:オプションを使用することができるように

qsub -V -sync y -t 1-$THREADS firstjob.sh 

echo "firstjob.sh completed" 

####ERROR RECEIVED#### 
qsub: script file 'y' cannot be loaded - No such file or directory 

4)(ダミーがちょうど空のファイルを作る)ダミーのシェルスクリプトを使用しました。これは、ダミースクリプトを提出するために一時停止することなく、echoのステートメントに直ちにプッシュします。両方のジョブがサブミットされ、すぐ後に1つ、一時停止しません。

job1=$(qsub -V -t 1-$THREADS demux.sh) 
echo "$job1" 

check=$(qsub -V -W depend=afterok:$job1 dummy.sh) 
echo "$check" 

echo "firstjob.sh completed" 

スクリプトに関するいくつかの詳細:

  • 各ジョブの提出は、配列ジョブです。
  • パイプラインは、次のようなコマンドを使用してターミナルで実行されていますので、私は3つの入力を提供します:ソースPipeline.sh -r list1.txt -d/workingDir/-s list2.txt
  • showqを使用すると、firstjob.shが実際に実行を完了していないことが確認されています。

おそらく、これらのシナリオのほとんどで簡単に修正されているかもしれませんが、これに新しいものがあります。私は本当に苦労しています。私はスクリプトを通して8-10の場所でこのメソッドを使用する必要があるので、実際に進歩を妨げています。助けていただければ幸いです。ありがとう。ここで

POSTのEDIT 1

はfirstjob.shに含まれるコードは...怪しいのにそれが役立つことを。ここにあるものはすべて期待どおりに機能し、常に正しい結果を生成します。

\#! /bin/bash 
\#PBS -S /bin/bash 
\#PBS -N demux 
\#PBS -l walltime=72:00:00 
\#PBS -j oe 
\#PBS -l nodes=1:ppn=4 
\#PBS -l mem=15gb 

module load biotools 
cd ${WORKDIR}/rawFQs/ 

INFILE=`head -$PBS_ARRAYID ${WORKDIR}${RAWFQ} | tail -1` 
BASE=`basename "$INFILE" .fq.gz` 

zcat $INFILE | fastx_barcode_splitter.pl --bcfile ${WORKDIR}/rawFQs/DemuxLists/${BASE}_sheet4splitter.txt --prefix ${WORKDIR}/fastqs/ --bol --suffix ".fq" 
+0

'firstjob.sh'の中にrelaventコードを含めるようにQを編集し、' wait'に応答するバックグラウンドプロセスをどこで使用しているのかを指定してください。良い最初の質問。幸運。 – shellter

+0

Thanks shellter。私はあなたのコメントの後半部分が何を意味しているかは完全には分かっていませんが、少し詳しく説明できますか? "wait"に応答するプロセス? –

+0

ええ、おっと、私はあなたが 'qsub'に仕事を渡していることを認識しています。サブプロセスをフォークして管理しているので、必ずしも'& 'は関係しません。しかし、それは 'wait'を使うことはあなたを助けません。私が考えることができるのは、 'qsub'ジョブがステップが完了したときに一意のフラグファイルを作成してから、それらのファイルが表示されるまでスクリプトが待機するようにすることだけです。ステータス情報(処理済み、エラー、警告など)を含むフラグファイルの追加クレジットここで 'qsub'のフォロワーは非常に少ないので、私はqsub固有のサポートフォーラムを探します。がんばろう! – shellter

答えて

0

セットアップについて違うのかわからない...そこにとても良いアイデア、私はちょうど-sync yを使用してみました、それは私のために働きました。

しかし、実行しているqsubジョブのステータスを知っているあなたのメインスクリプトを試してみることもできます。 1つのアイデアは、メインスクリプトがqstatを使用してジョブのステータスをチェックし、処理が完了するまで待機することです。

また、最後のステップとしてファイルに最初のジョブを書き込むこともできます(または、提案したように、最初のジョブが完了するのを待つダミージョブを設定することもできます)。その後、メインのスクリプトで、そのファイルが書き込まれているかどうかを調べることができます。

関連する問題