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
매초마다 자동으로 증가하는 ( 및 )에서 제공하는 내장 변수를 사용합니다 .ksh
bash
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}
그리고 코드 전체에서.