ファイルが見つからない場合は、シェルスクリプトで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}そしてコード全体で。

関連情報