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(https://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html또는 다운로드:https://doi.org/10.5281/zenodo.1146014)
20분도 채 걸리지 않으며 명령줄이 마음에 들 것입니다.