Como verificar se a hora atual é entre 23:00 e 06:30

2

Eu sinto muito se isso parece lição de casa, mas eu estou tendo problemas em entender como checar corretamente um script bash se a hora atual estiver entre 23:00 e 06:30. Estou tentando executar um loop infinito para verificar a hora agora e fazer algo se o intervalo de tempo estiver entre as 23h e as 6h30. Aqui está o que escrevi até agora, o que não funciona no dia seguinte:

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 &
 }

Por favor, alguém pode me dizer o que estou fazendo errado?

    
por Sina 04.10.2017 / 01:06

3 respostas

6

Se tudo que você precisa é verificar se HH:MM é entre 23:00 e 06:30, então não use timestamps Unix. Basta verificar os valores de HH:MM diretamente:

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 &
}

Notas:

  • O tempo em HH:MM estará em ordem lexicográfica, para que você possa compará-los diretamente como strings.
  • Evite usar -a ou -o in [ ] , use || e && .
  • Como isso é bash, prefira [[ ]] over [ ] , isso facilita a vida.
por 04.10.2017 / 01:33
4

Se você quiser ser mais explícito sobre os horários que deseja corresponder, poderá usar uma instrução case . Aqui está um loop de 24 horas com uma instrução de caso dentro que indica se a hora atual corresponde ao seu intervalo:

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

Para usá-lo em seu script, basta substituir as variáveis por uma chamada para date :

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

Você pode considerar ser mais amigável com sua CPU e calcular a quantidade de tempo entre (agora) e a próxima hora de início e sleep por esse período de tempo.

    
por 04.10.2017 / 19:12
0

Eu tenho uma situação semelhante. Meu objetivo é ter uma solução que seja muito simples para os geeks não-unix manterem.

Quando meu servidor Linux é reiniciado, ele executa um script que envia um alerta. Mas se isso acontecer como parte de nossa "Janela de Manutenção", que é definida entre as 23h de sábado e as 6h de domingo, eu não quero enviar a página, porque uma reinicialização durante esta janela é OK (correções aplicadas, etc.). Eu testei e funciona como pretendido (tanto quanto eu posso dizer).

Aqui está o calendário para referência:

      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

Aqui está o meu código de teste:

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

Aqui está a saída

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
    
por 22.06.2018 / 18:02