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-runGNU 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분도 채 걸리지 않으며 명령줄이 마음에 들 것입니다.

관련 정보