0

你好!现在我下面的脚本可以工作,但不是我想要的方式。首先,我必须对代码块执行“set +e”,否则脚本将在第一个错误时退出。

有时,当我的脚本运行时,他们的报告还没有准备好。因此,将没有文件可以移动到 $temp_dir 目录。这是退出状态 1 错误。

那么我怎样才能使脚本的行为如下:

  • 在退出状态 1(或者如果文件不存在,以更好的错误捕获前提为准),等待/睡眠 20 分钟,然后尝试再次下载报告并将其移动到 $temp_dir 目录。
  • 当退出状态为 0(成功)或文件存在时,移动到 $temp_dir 目录,然后继续脚本的其余部分。我想这是它将脱离循环的地方。
  • 最多重试 5 次,每次 20 分钟。如果达到最大重试次数,退出循环并退出脚本,然后返回错误或发送错误电子邮件通知。

    #! /bin/bash
    ...
    
    set +e
    java Autoingestion autoingestion.properties ${VENDOR_ID} Sales Daily Summary ${REPORT_DATE}
    mv ${BASE_FILENAME} ${temp_dir}
    
    # File or directory not found from moving, so exit status should be 1.
    echo "Exit status " $?
    while [[ $? -ne 0 ]] & [[ ${RETRY} -lt 6 ]]; do
        sleep 1200
        printf "\n"
        echo "Retrying download attempt #${RETRY} out of 5"
        java Autoingestion autoingestion.properties ${VENDOR_ID} Sales Daily Summary ${REPORT_DATE}
        mv ${BASE_FILENAME} ${temp_dir}
        if [ $? -eq 0 ]; then
                echo "Download retry successful!"
                mv ${BASE_FILENAME} ${temp_dir}
                break; # Skip entire loop
        fi
        let RETRY=RETRY+1
    done
    set -e
    printf "\n"
    

    基本上,这是一种尝试说“如果第一次尝试失败,请等待 20 分钟,然后再试一次(最多 5 次)。
    非常感谢您的意见。

  • 4

    1 回答 1

    0

    这应该是解决方案:

    while [ $counter -lt 11 ]; do
    download the report
    if [ -f $BASE_FILENAME ]; then
        break;
    else 
        echo "Report unavailable. Retrying in 20 minutes"
        increase counter value by 1
    fi
    done
    
    于 2013-10-21T16:21:26.837 回答