シェルスクリプトは1時間ファイルの可用性を確認し、1時間後にファイルが存在しない場合は「timeout」と表示されます。

シェルスクリプトは1時間ファイルの可用性を確認し、1時間後にファイルが存在しない場合は「timeout」と表示されます。

このコードを書いています。しかし、問題は、300秒ごとに$ fnameがループで終了すると、「Time over」が印刷されることです。ファイルが届かない場合は、1時間後に「タイムアウト」が必要ですが、300秒後に「タイムアウト」印刷が始まります。

echo "enter file name"

read fname

START=`date +%s`
while [ $(( $(date +%s) - 3600 )) -lt $START ]; do
  if [ -e $fname ]
  then
    echo "$fname present"
    break
    sleep 300
  else
    echo "Time Over"
  fi
done

ベストアンサー1

私の考えでは、あなたはかなり近いと思いますが、スクリプトのいくつかの側面は過度に複雑に見えます。

次のwhileループを試すことができます。

#!/bin/sh

timeout=3600
granularity=300
elapsed=0

echo "Please enter the filename"
read -r file

while [ "$elapsed" -lt "$timeout" ]
do
    if [ -f "$file" ]
    then
        break
    fi

    sleep "$granularity"
    elapsed=$((elapsed+granularity))
done

# Was the loop broken because the file appeared, or did it time out?
if [ -f "$file" ]
then
    echo "$file has appeared"
else
    echo "Time over"
fi

この値を超える$granularityまで、毎秒ファイルが存在することを確認してください。$timeoutファイルがすでに存在する場合、スクリプトはループから出ます。

アプローチの問題は、「タイムアウト」出力がelse定期的に確認される分岐にあることです。ループを繰り返すたびにファイルが見つからない場合。代わりに確認してみることをお勧めします。ループ後テスト変数(スクリプトの出力date)が範囲外(ループタイムアウトを示す)ファイルが存在する場合は、「タイムアウト」メッセージを出力するかどうかを決定します。

おすすめ記事