GNU Parallel --joblog 仅记录 for 循环内的第一行命令

GNU Parallel --joblog 仅记录 for 循环内的第一行命令

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 分钟的时间,你的命令行会喜欢你的。

相关内容