Bom método para comparar o tempo?

10

Preciso verificar a hora atual e abortar o script, se não for a hora adequada do dia em que devo executá-lo. Além disso, se alguém o executar, deve abortar.

Por exemplo: preciso que meu script seja executado apenas se for iniciado entre 22h e 2h (uma janela de 4 horas).

Atualmente, estou fazendo o seguinte. Tomando o tempo date +%k%Me comparando com números codificados

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

Eu gostaria de saber se existe algum outro método eficiente com relação à comparação de tempos em shou bash?

mtk
fonte
1
Se você precisa comparar duas datas tentar convertê-los para MJD ou UNIX tempo, por exemplo: date +%s.
Eddy_Em 04/02
1
@ Eddy não, não é a data, é a hora que eu preciso comparar.
mtk
1
Eu acho que, em segundos, seria melhor: currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then
Eddy_Em 04/02
por que não colocar o script no crontab? Desta forma, você garantir que ele seja executado naquele momento específico
BitsOfNix
1
Como qualquer usuário pode alterar o tempo de um processo faketime, seu script não é muito seguro. Usar lockfiles é provavelmente uma opção melhor.
Jofel

Respostas:

6

Isso parece perfeito para mim. O que faz você pensar que deveria ser melhorado?

De qualquer forma, maneiras de melhorá-lo podem ser:

  • Use um shell menor e mais rápido que o bash, como dash ou pdksh.
  • use um shell que possua recursos de data integrados, como zshouksh93
  • use gawk(que é menor que o bash, mas não que o traço, mas pode evitar o garfo extra):

Exemplo:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}
Stéphane Chazelas
fonte
OK legal. Só queria confirmar que o que estou fazendo não é bruto ou mau. Obrigado pelas sugestões.
mtk
4

Se ferramentas externas forem permitidas, convém verificar dateutils.

Seu "script" se torna:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

Disclaimer: Eu sou o autor da referida ferramenta.

hroptatyr
fonte