Buen método para comparar el tiempo?

10

Necesito verificar la hora actual y abortar el script si no es la hora correcta del día en la que se supone que debo ejecutarlo. Además, si alguien más lo ejecuta, debería abortar.

Por ejemplo: necesito que mi script solo se ejecute si se inicia entre las 10 p.m. y las 2 a.m. (una ventana de 4 horas).

Actualmente estoy haciendo lo siguiente. Tomarse el tiempo date +%k%My comparar con 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

Me gustaría saber si hay algún otro método eficiente con respecto a la comparación de tiempo en sho bash.

mtk
fuente
1
Si es necesario comparar dos fechas tratar de convertirlos a MJD o UNIX tiempo, por ejemplo: date +%s.
Eddy_Em
1
@ Eddy no, no es la fecha, es el momento que necesito comparar.
mtk
1
Creo que, en segundos, sería mejor: 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
¿Por qué no poner el script en el crontab? de esta manera te aseguras de que se ejecuta en ese momento específico
BitsOfNix
1
Como cualquier usuario puede cambiar el tiempo de un proceso faketime, su script no es muy seguro. Usar lockfiles es probablemente una mejor opción.
jofel

Respuestas:

6

Eso me parece perfecto. ¿Qué te hace pensar que debería mejorarse?

De todos modos, las formas de mejorarlo podrían ser:

  • Use un shell más pequeño y rápido que bash como dash o pdksh.
  • usar un shell que tiene capacidades de fecha incorporadas como zshoksh93
  • use gawk(que es más pequeño que bash, pero no como dash, pero podría evitar la bifurcación adicional):

Ejemplo:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}
Stéphane Chazelas
fuente
está bien. Solo quería confirmar que lo que estoy haciendo no es crudo ni malo. Gracias por las sugerencias
mtk
4

Si se permiten herramientas externas, es posible que desee verificar dateutils.

Su "guión" se convierte en:

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

Descargo de responsabilidad: soy el autor de dicha herramienta.

hroptatyr
fuente