Dobra metoda porównywania czasu?


10

Muszę sprawdzić aktualny czas i przerwać skrypt, jeśli nie jest to właściwa pora dnia, mam go uruchomić. Ponadto, jeśli ktoś go uruchomi, powinien przerwać.

Na przykład: chcę, aby mój skrypt działał tylko wtedy, gdy został uruchomiony między 22:00 a 2:00 (okno 4-godzinne).

Obecnie wykonuję następujące czynności. Nie spiesz się date +%k%Mi porównuj z cyframi zakodowanymi na stałe

#!/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

Chciałbym wiedzieć, czy istnieje jakaś inna skuteczna metoda w odniesieniu do porównania czasu w shlub bash?


1
Jeśli chcesz porównać dwie daty spróbować przekonwertować je na MJD lub UNIX czasie, na przykład: date +%s.
Eddy_Em

1
@Eddy nie to nie data, to czas, który muszę porównać.
Mt

1
Myślę, że za kilka sekund byłoby lepiej: 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

dlaczego nie umieścić skryptu w crontab? w ten sposób
upewnisz się

1
Ponieważ każdy użytkownik może zmienić czas procesu faketime, skrypt nie jest zbyt bezpieczny. Korzystanie z plików blokujących jest prawdopodobnie lepszą opcją.
jofel

Odpowiedzi:


6

Dla mnie to wygląda idealnie. Co sprawia, że ​​uważasz, że należy to poprawić?

W każdym razie, sposoby na ulepszenie mogą być:

  • Użyj mniejszej, szybszej powłoki niż bash, np. Dash lub pdksh.
  • użyj powłoki z wbudowanymi funkcjami daty, takimi jak zshlubksh93
  • użyj gawk(który jest mniejszy niż bash, ale nie mniej niż dash, ale mógłby uniknąć dodatkowego widelca):

Przykład:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}

ok fajnie. Chciałem tylko potwierdzić, że to, co robię, nie jest prymitywne ani złe. Dziękuję za sugestie.
mtk

4

Jeśli dozwolone są narzędzia zewnętrzne, możesz chcieć to sprawdzić dateutils.

Twój „skrypt” staje się:

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

Oświadczenie: Jestem autorem wspomnianego narzędzia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.