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}
そしてコード全体で。