파일을 찾을 수 없는 경우 쉘 스크립트에서 4시간 후에 while 루프를 중지하는 방법은 무엇입니까?

파일을 찾을 수 없는 경우 쉘 스크립트에서 4시간 후에 while 루프를 중지하는 방법은 무엇입니까?

SFTP 서버에서 파일을 가져와 로컬로 복사하고 파일이 사용 가능한지 확인하기 위해 ksh 스크립트를 작성 중입니다. 파일을 사용할 수 있으면 루프에서 이것을 실행한 다음 즉시 루프에서 나와 나머지 스크립트를 계속 실행합니다. 파일을 사용할 수 없는 경우 5분 동안 절전 모드로 전환한 후 SFTP 서버에서 해당 파일을 다시 검색합니다.

루프를 중단하고 4시간 후에 스크립트가 실패하도록 하고 4시간 동안 검색한 후에 파일을 찾을 수 없다는 내용의 이메일을 보내려면 아래 코드에 논리를 추가해야 합니다. 이 코드를 계속 사용하는 방법을 모르겠습니다. 이것은 매우 혼란스럽습니다.

PROCESS=0
    while [[ ${PROCESS} -ne 1 ]]; do
    echo "Connecting to sftp" >> $log
    sftp uname$host_name <<EOF
        cd folder
        get filename
        bye
EOF

    CHECK=`find "${source}" -maxdepth 1 -name "file_name" -mtime -2 | egrep '.*' | wc -l`
    echo -e "Number of files found ${CHECK}" >> $log
        if [[ ${CHECK} -eq 0 ]]; then
            echo -e "ERROR :: file not found.Will sleep for 5 minutes. ---`date` \n" >> $log
            SendMail --This is a function
            sleep 300
        elif [[ ${CHECK} -eq 1 ]]; then
            echo -e "file found in ${source}" >> $log
            PROCESS=1
        fi
    done

답변1

타이머의 논리는 어렵지 않습니다. 이 버전은 $SECONDS매초마다 자동으로 증가하는 ( 및 )에서 제공하는 내장 변수를 사용합니다 .kshbash

hours=4
end_time=$(( (hours*60*60) + SECONDS ))

while [ "$SECONDS" -le "$end_time" ]
do
    # stuff
    sleep 5
done

while이를 기존 루프에 통합하려면 타이머가 만료되거나 파일을 가져올 때 종료되도록 조건을 확장하면 됩니다 .

while [ "$PROCESS" -ne 1 ]
do
    # Check for timeout
    if [ "$SECONDS" -gt "$end_time" ]
    then
        # Report an error
        echo "ERROR: File still not found after ${hours:-some} hours" >&2

        # Send an email using whatever tools you have
        # ...

        # Exit
        exit 1
    fi

    # Look for the file
    # ...
    sleep 5
done

단순 변수 주위의 중괄호는 쉘 스크립트에서 거의 의미가 없지만 큰따옴표는 매우 중요합니다. 예를 들어 "$PROCESS"대신 사용하세요. ${PROCESS}그리고 코드 전체에서.

관련 정보