현재 시간이 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

관련 정보