最終的に私のために働いたのは、提案された解決策(1)でした。ここでは、コンドル送信ファイルとワーカーシェルスクリプトに(1)を実装する方法について説明します。
これがシェルスクリプトです。重要な変更は、Rが以下を介して計算ノードにインストールされているかどうかを確認することでしたif [ -f /usr/bin/R ]
。Rが見つかった場合は、戻り値0で終わるパスをたどります。Rが見つからなかった場合は、1を返します(これが行exit 0
との意味ですexit 1
)。
mkdir output
if [ -f /usr/bin/R ]
then
if $(uname -m |grep '64')
then
Rscript code/simulations-x86_64.r $*
else
Rscript code/simulations-i386.r $*
fi
tar -zcvf output/output-$1-$2.tgz2 output/*.csv
exit 0
else
exit 1
fi
これで、コンドル送信ファイルが作成されました。重要な変更は、最後から2番目の行(on_exit_remove = (ExitBySignal == False) && (ExitCode == 0)
)でした。計算ノードからの各ジョブの戻り値をチェックします。戻り値がゼロでない場合(つまり、計算ノードでRが見つからなかった場合)、ジョブはキューに戻されて再実行されます。それ以外の場合、ジョブは終了したと見なされ、キューから削除されます。
universe = vanilla
log = logs/log_$(Cluster)_$(Process).log
error = logs/err_$(Cluster)_$(Process).err
output = logs/out_$(Cluster)_$(Process).out
executable = condor/worker.sh
arguments = $(Cluster) $(Process)
requirements = (Target.OpSys=="LINUX" && regexp("stat", Machine))
should_transfer_files = YES
when_to_transfer_output = ON_EXIT_OR_EVICT
transfer_input_files = code, R-libs, condor, seeds.csv
transfer_output_files = output
notification = Never
on_exit_remove = (ExitBySignal == False) && (ExitCode == 0)
queue 1800