![如果找不到文件,如何在 shell 脚本中四个小时后停止 while 循环?](https://linux22.com/image/229294/%E5%A6%82%E6%9E%9C%E6%89%BE%E4%B8%8D%E5%88%B0%E6%96%87%E4%BB%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%9B%9B%E4%B8%AA%E5%B0%8F%E6%97%B6%E5%90%8E%E5%81%9C%E6%AD%A2%20while%20%E5%BE%AA%E7%8E%AF%EF%BC%9F.png)
我正在编写 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}
并贯穿您的代码。