現在時刻が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:MM
Unixタイムスタンプを使用しないでください。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