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 文件中
答案1
--joblog
仅在作业完成时添加到作业日志中。
您为 GNU Parallel 提供了两项工作:
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》的第 1+2 章,将会是值得的(https://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html或下载:https://doi.org/10.5281/zenodo.1146014)
它应该花费你不到 20 分钟的时间,你的命令行会喜欢你的。