如果找不到文件,如何在 shell 脚本中四个小时后停止 while 循环?

如果找不到文件,如何在 shell 脚本中四个小时后停止 while 循环?

我正在编写 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变量,该变量每秒自动递增。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

请注意,简单变量周围的大括号在 shell 脚本中意义不大,但双引号非常重要。例如,使用"$PROCESS"代替。${PROCESS}并贯穿您的代码。

相关内容