Gute Methode, um die Zeit zu vergleichen?

10

Ich muss nach der aktuellen Uhrzeit suchen und das Skript abbrechen, wenn es nicht die richtige Tageszeit ist, zu der ich es ausführen soll. Wenn es von jemand anderem ausgeführt wird, sollte es ebenfalls abgebrochen werden.

Beispiel: Ich muss mein Skript nur ausführen, wenn es zwischen 22 Uhr und 2 Uhr morgens gestartet wird (ein 4-Stunden-Fenster).

Derzeit mache ich Folgendes. Nehmen Sie sich Zeit date +%k%Mund vergleichen Sie mit fest codierten Zahlen

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

Ich würde gerne wissen, ob es eine andere effiziente Methode für den Zeitvergleich in shoder gibt bash.

mtk
quelle
1
Wenn Sie zwei Daten vergleichen müssen, versuchen Sie, sie in MJD- oder UNIX-Zeit zu konvertieren, zum Beispiel : date +%s.
Eddy_Em
1
@ Eddie nein, es ist nicht das Datum, es ist die Zeit, die ich vergleichen muss.
MTK
1
Ich denke, in Sekunden wäre es besser: 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
Warum nicht das Skript in die Crontab legen? Auf diese Weise stellen Sie sicher, dass es zu dieser bestimmten Zeit ausgeführt wird
BitsOfNix
1
Da jeder Benutzer die Zeit für einen Prozess mit ändern kann faketime, ist Ihr Skript nicht sehr sicher. Die Verwendung von Sperrdateien ist wahrscheinlich eine bessere Option.
Jofel

Antworten:

6

Das sieht für mich perfekt aus. Was lässt Sie denken, dass es verbessert werden sollte?

Wie auch immer, Möglichkeiten zur Verbesserung könnten sein:

  • Verwenden Sie eine kleinere, schnellere Shell als Bash wie Dash oder Pdksh.
  • Verwenden Sie eine Shell mit Datumsfunktionen wie zshoderksh93
  • Verwendung gawk(die kleiner als Bash, aber nicht als Dash ist, aber die zusätzliche Gabel vermeiden könnte):

Beispiel:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}
Stéphane Chazelas
quelle
OK Cool. Ich wollte nur bestätigen, dass das, was ich tue, nicht grob oder böse ist. Danke für die Vorschläge.
MTK
4

Wenn externe Tools zulässig sind, möchten Sie möglicherweise überprüfen dateutils.

Ihr "Skript" wird:

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

Haftungsausschluss: Ich bin der Autor dieses Tools.

hroptatyr
quelle