我正在编写 ksh 脚本,从 sftp 服务器获取文件并复制到本地并检查该文件是否可用。如果文件可用,我将在循环中运行此文件,那么它将立即从循环中出来并继续执行脚本的其余部分。如果文件不可用,则它会休眠 5 分钟,然后再次在 sftp 服务器中搜索该文件。
我需要在下面的代码中添加逻辑,以中止循环并在 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
请注意,简单变量周围的大括号在 shell 脚本中意义不大,但双引号非常重要。例如,使用"$PROCESS"
代替。${PROCESS}
并贯穿您的代码。