我沿着这样的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
是否有可能获得第二行
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X >$OUTPUT_PIXEL_SIZE_Y"
仅或与第一个一起包含在由--joblog
?创建的 .log 文件中
--joblog
仅在作业完成时添加到作业日志。您正在为 GNU Parallel 提供两项工作:
log
快速完成并添加到作业日志中,但gdalmerge_and_clean
可能需要更长的时间才能运行。我认为你应该考虑将你的工作重写为一个函数并调用它:
--dry-run
如果 GNU Parallel 做了一些你不期望的事情,我建议你试试。它会告诉你它打算运行什么命令。如果您阅读 GNU Parallel 2018 的第 1+2 章(https://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html或下载地址:https ://doi.org/10.5281/zenodo.1146014 )
只需不到 20 分钟的时间,您的命令行就会爱上它。