現在時刻が23:00から06:30の間であることを確認する方法

現在時刻が23:00から06:30の間であることを確認する方法

現在時刻が23:00~06:30の場合、bashスクリプトで正しくチェックする方法がわかりません。今の時間を確認し、時間範囲が午後11時から午前6時30分の間にあるときにいくつかのタスクを実行するために無限ループを実行しようとしています。これは私がこれまでに書いたものであり、翌日には機能しませんでした。

fireup()
{

 local starttime=$(date --date="23:00" +"%s")
 local endtime=$(date --date="06:30" +"%s")

 while :; do
     local currenttime=$(date +%s)
     if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
        do_something
     else
         do_something_else
     fi
     test "$?" -gt 128 && break
     local currenttime=$(date +%s)
 done &
 }

私は何が間違っていましたか?

答え1

必要なものが23:00から06:30の間であることを確認するだけであれば、HH:MMUnixタイムスタンプを使用しないでください。HH:MM値を直接確認してください。

fireup()
{  
  while :; do
   currenttime=$(date +%H:%M)
   if [[ "$currenttime" > "23:00" ]] || [[ "$currenttime" < "06:30" ]]; then
     do_something
   else
     do_something_else
   fi
   test "$?" -gt 128 && break
  done &
}

メモ:

  • 時間はHH:MM辞書順なので、文字列で直接比較できます。
  • 使用を避ける-a-oまたは[ ]、使用||および&&取り替え。
  • bashだから[[ ]]好みます[ ]。人生が楽になります。

答え2

一致させる時間をより明示的に指定するには、ステートメントを使用できますcase。以下は、現在の時間が範囲と一致するかどうかを示すCaseステートメントを含む24時間ループです。

for hh in {00..23}
do
  for mm in {00..59}
  do
    case $hh:$mm in
        (23:*)        echo YES $hh:$mm;;
        (0[012345]:*) echo YES $hh:$mm;;
        (06:[012]*)   echo YES $hh:$mm;;
        (*)           echo  NO $hh:$mm;;
    esac
  done
done

スクリプトで使用するには、変数を呼び出しに置き換えますdate

case $(date +%H:%M) in
    (23:*)        echo YES;;
    (0[012345]:*) echo YES;;
    (06:[012]*)   echo YES;;
    (*)           echo NO;;
esac

CPUフレンドリーな方法を検討し(現在)と次の開始時間の間の時間を計算できます。sleepその間。

答え3

「今日」が開始されてからの時間を秒に変換してから、秒値が(82800)より大きいか(23400)未満である23*60*60ことを確認できます。6*60*60+30*60

「今日」が開始されてからの秒数を取得するには、次のようにします。

secsSinceMidnight=$(( $(date +%s) - $(date -d '00:00:00' +%s) ))

テストは次のとおりです。

[[ $secsSinceMidnight -lt 23400 || $secsSinceMidnight -gt 82800 ]] && echo YES

答え4

私は同様の状況にあります。私の目標は、UNIXの専門家以外の人がメンテナンスするのが非常に簡単なソリューションを提供することです。

私のLinuxサーバーが再起動すると、警告を送信するスクリプトが実行されます。ただし、この問題が「メンテナンス期間」(土曜日の午後11時から日曜日の午前6時の間に定義されています)の間に発生した場合、この期間中に再起動しても問題がないため、ページを送信したくありません(パッチ適用など)。テストした結果、期待どおりに動作しました(私の知る限り)。

参考のカレンダーは次のとおりです。

      June 2018
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

これは私のテストコードです。

FMT='+%k:%a' # i.e. Sat:23 for Saturday at 11pm local time

TESTDATE1=$(date -d '2018-06-23 14:30:00' $FMT)
TESTDATE2=$(date -d '2018-06-23 23:59:59' $FMT)
TESTDATE3=$(date -d '2018-06-24 00:00:00' $FMT)
TESTDATE4=$(date -d '2018-06-24 05:59:59' $FMT)
TESTDATE5=$(date -d '2018-06-24 08:01:00' $FMT)

for VAL in "${TESTDATE1}" $TESTDATE2 $TESTDATE3 $TESTDATE4 $TESTDATE5
do

    #extract the 24 hour value and the day
    HH="$(echo ${VAL} | cut -d':' -f1)"
    DAY="$(echo ${VAL} | cut -d':' -f2)"

    echo Testing $VAL  $HH  $DAY

    if [[ "$DAY" = "Sat" && $HH -ge 23 ]]; then
            echo '    Shhhh People are trying to sleep ... Sat window'
    elif [[ "$DAY" = "Sun" && $HH -le 6 ]]; then
            echo '    People are trying to sleep ... Sun window'
    else
            echo '    PAGE SOMEONE - time is outside the Maintenance Window'
    fi

done

これが出力です

Testing 14:Sat 14 Sat
    PAGE SOMEONE - time is outside the Maintenance Window
Testing 23:Sat 23 Sat
    Shhhh People are trying to sleep ... Sat window
Testing 0:Sun 0 Sun
    People are trying to sleep ... Sun window
Testing 5:Sun 5 Sun
    People are trying to sleep ... Sun window
Testing 8:Sun 8 Sun
    PAGE SOMEONE - time is outside the Maintenance Window

関連情報