Un buon metodo per confrontare i tempi?


10

Devo controllare l'ora corrente e interrompere lo script se non è l'ora del giorno corretta dovrei eseguirlo. Inoltre, se qualcun altro lo esegue, dovrebbe interrompere.

Ad esempio: ho bisogno che il mio script venga eseguito solo se viene avviato tra le 22:00 e le 2:00 (una finestra di 4 ore).

Attualmente sto facendo quanto segue. Prendendo il tempo con date +%k%Me confrontando con i numeri codificati

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

Vorrei sapere se esiste un altro metodo efficace per quanto riguarda il confronto temporale in sho bash?


1
Se avete bisogno di confrontare due date cercare di convertirli in MJD o UNIX tempo, ad esempio: date +%s.
Eddy_Em

1
@Eddy no non è la data, è il momento che devo confrontare.
mtk,

1
Penso che in pochi secondi sarebbe meglio: 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

perché non mettere la sceneggiatura nel crontab? in questo modo ti assicuri che funzioni a
quell'ora

1
Poiché qualsiasi utente può modificare i tempi di un processo faketime, lo script non è molto sicuro. L'uso di lockfile è probabilmente un'opzione migliore.
jofel

Risposte:


6

Mi sembra perfetto. Cosa ti fa pensare che dovrebbe essere migliorato?

Ad ogni modo, i modi per migliorarlo potrebbero essere:

  • Usa una shell più piccola e più veloce di bash come dash o pdksh.
  • usa una shell con funzionalità di data integrate come zshoksh93
  • uso gawk(che è più piccolo di bash, ma non di trattino ma potrebbe evitare la forcella extra):

Esempio:

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

ok bello. Volevo solo confermare che quello che sto facendo non è rozzo o malvagio. Grazie per i suggerimenti
mtk,

4

Se sono consentiti strumenti esterni, potresti voler controllare dateutils.

Il tuo "script" diventa:

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: sono l'autore di detto strumento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.