for
私は次のループに沿ってGNU Parallelを使用しています。
for BAND in $(seq 1 "$BANDS") ;do
# Do not extract, unscale and merge if the scaled map exists already!
SCALED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged_scaled.nc"
MERGED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged.nc"
if [ ! -f "${SCALED_MAP+set}" ] ;then
echo "log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)"
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
else
echo "warning "Scaled map "$SCALED_MAP" exists already! Skipping merging.-""
fi
done |parallel -j 20 --joblog "parallel.${JOB_CLUSTER_PROCESS}.log"
log "$LOG_FILE" "Action=Merge, End=$(timestamp)"
(記録用:${JOB_CLUSTER_PROCESS}"
HTCondorで変数を提供した場合)
ログには次の項目のみが表示されます。最初注文する
echo "log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel >size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)"
これは実際には、このループ中にアクションを記録するカスタムメソッドです。
# tell what you are doing
function log {
echo "${@: 2}" 2>&1 >> "$1" ;
}
export -f log
2行目を取得できますか?
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X >$OUTPUT_PIXEL_SIZE_Y"
--joblog
によって生成された.logファイルには、最初のエントリのみが含まれるか、一緒に含まれます。
ベストアンサー1
--joblog
ジョブが完了した場合にのみジョブログに追加されます。
GNU Parallelには2つのタスクがあります。
log ...
gdalmerge_and_clean ...
log
すばやく完了し、ジョブログに追加されますが、gdalmerge_and_clean
実行に時間がかかることがあります。
私の考えでは、タスクを関数として書き換えて呼び出すことを検討する必要があると思います。
doit() {
BAND=$1
# Do not extract, unscale and merge if the scaled map exists already!
SCALED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged_scaled.nc"
MERGED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged.nc"
if [ ! -f "${SCALED_MAP+set}" ] ;then
log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)
gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y
else
warning "Scaled map "$SCALED_MAP" exists already! Skipping merging.-"
fi
}
export -f doit
seq 1 "$BANDS" |
parallel -j 20 --joblog "parallel.${JOB_CLUSTER_PROCESS}.log" doit {}
log "$LOG_FILE" "Action=Merge, End=$(timestamp)"
--dry-run
GNU Parallelが予期しない操作を実行した場合は、試してみることをお勧めします。どのコマンドを実行したいかを教えてくれます。
GNU Parallel 2018(https://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.htmlまたはダウンロード:https://doi.org/10.5281/zenodo.1146014)
20分もかからず、コマンドラインが好きです。