Dormire fino alla prossima occorrenza di un tempo specifico


11

Ho bisogno di una serie di comandi o di un singolo comando che dorme fino alla successiva occorrenza di un momento specifico come "4:00".

Come potrei farlo?

Il atcomando o un cronjob non è un'opzione perché non devo lasciare lo script in cui mi trovo attualmente.

Il caso specifico di cui sto parlando è uno script in esecuzione sullo schermo. È molto importante che io non fermi l'esecuzione dello script dallo script stesso perché ci sono molte variabili importanti che sono necessarie in qualche punto dello script. La sceneggiatura non dovrebbe sempre essere eseguita regolarmente. Deve solo essere eseguito in un momento specifico.

Sarebbe molto positivo se lo script dovesse creare file o altre attività come cronjobs o altre schermate. Questa è semplicemente una questione di design.

Ho avuto un'idea stupenda:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Hai idee migliori?

Ulteriori informazioni verranno aggiunte se richiesto!


Per favore, potresti chiarire un po 'la tua domanda? Cosa intendi quando dici: "Non devo lasciare la sceneggiatura in cui mi trovo attualmente"
sebelk,

Che ne dici di avere il tuo script verificare l'esistenza di un file "sveglia" e dormire per un periodo di tempo prima di ricontrollare? Quindi puoi usare cron per creare il file, sfruttando l'affidabilità di cron, ma puoi avere anche il tuo script di lunga durata. Chiedi allo script di rimuovere il file "wake up" quando smette di dormire.
Kurtm,

Si noti che su un Mac è necessario sostituire date -dcon date -je sostituirlo 4:00con 0400.
Pjvandehaar,

Risposte:


17

Il suggerimento di Terdon funzionerebbe, ma immagino che il mio sia più efficiente.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Questo sta calcolando la differenza tra il tempo dato e l'ora corrente in secondi. Se il numero è negativo, dobbiamo aggiungere i secondi per un'intera giornata (86400 per l'esattezza) per ottenere i secondi in cui dobbiamo dormire e se il numero è postivo possiamo semplicemente usarlo.


Cosa succede se l'orologio di sistema si sposta in avanti / indietro (ad es. Ntp).
WhyNotHugo,

10

Supponendo che sia uno script di shell, questo dovrebbe funzionare:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

Questo è per 24 ore. Se vuoi che continui sia alle 4:00 che alle 16:00, usa invece:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

Questa potrebbe essere un'opzione. Ho appena avuto un'idea. Torno tra qualche minuto.
BrainStone,

0

Su OpenBSD , si potrebbe usare quanto segue per compattare un lavoro di */55 minuti crontab(5)in uno 00orario (per assicurarsi che vengano generati meno messaggi di posta elettronica, il tutto mentre si esegue la stessa attività ad intervalli esatti):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

Si noti che date(1)ciò interromperà anche la sleep(1)progettazione dell'iterazione finale, poiché i 60minuti non sono un tempo valido (a meno che non lo sia!), Quindi non dovremo aspettare altro tempo prima di ricevere il nostro rapporto e-mail.

Si noti inoltre che se una delle iterazioni impiegasse più di 5 minuti ad essa assegnate, allo sleepstesso modo fallirebbe gentilmente con la progettazione non dormendo affatto (a causa di ciò che è un numero negativo interpretato come un'opzione della riga di comando, invece di spostarsi attorno a l'ora successiva o anche l'eternità), assicurandoti così che il tuo lavoro possa ancora essere completato entro l'ora assegnata (ad esempio, se solo una delle iterazioni impiega poco più di 5 minuti, avremmo comunque il tempo di recuperare, senza qualcosa che si aggira intorno all'ora successiva).

Il printf(1)è necessario perché datesi aspetta esattamente due cifre per la specifica minuto.

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.