Unix: sleep fino all'ora specificata


10

Esiste un comando Unix (semi) standard che dormirà fino al tempo specificato sulla sua riga di comando? In altre parole, sto cercando qualcosa di simile sleepche richiederebbe il tempo di sveglia piuttosto che la durata.

Per esempio: sleeptill 05:00:00

Posso codificare qualcosa ma preferirei non reinventare la ruota se c'è già qualcosa là fuori.

Domanda bonus: sarebbe bello se potesse prendere il fuso orario (come in sleeptill 05:00:00 America/New_York).

modifica A causa della natura di ciò che sto facendo, sto cercando una soluzione "sleep fino a T" piuttosto che "esegui comando a T".

modifica A scanso di equivoci, se eseguo il comando alle 18:00 e gli dico di svegliarsi alle 17:00, mi aspetto che dorma per 23 ore (o, in alcuni casi angolari, che hanno a che fare con l'ora legale, per 22 o 24 ore.)


Potresti usare cron, immagino.
Bobby,

Grazie, ma per l'uso previsto deve essere davvero sleepsimile.
NPE,

Risposte:


16

Se sei su un Unix che ha un comando di data decente e stai usando bash, potresti usare il formato% s per calcolare il tempo.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 è alle 17:00 e -j indica la data per non impostare effettivamente la data)


(+1) per il suggerimento. Se eseguo il comando alle 18:00 e gli dico di svegliarsi alle 17:00, mi aspetto che dorma per 23 ore (o, in alcuni casi angolari, che hanno a che fare con l'ora legale, per 22 o 24 ore). Questo è dove il suggerimento purtroppo si interrompe. [Ho anche dovuto modificare il -jper -dfarlo funzionare sui miei sistemi Linux.]
NPE il

7
@aix: su Linux (e altri sistemi con data GNU), è possibile utilizzare specifiche di data sofisticate come date -d 'tomorrow 17:00'.
Gilles,

3
@NPE, a proposito, si può compensare usando la divisione promemoria: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(potrebbero esserci solo alcuni problemi relativi alle modifiche
dell'ora

10

Che ne dici di questo (combinando le idee di w00t e Gille in una funzione)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Uso:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds

8

Dai un'occhiata al atcomando linux / unix . Utilizzando l'esempio 5AM:

at 05:00 some_command

Supporta anche fusi orari:

È possibile seguire un nome di fuso orario GMT, UCT o ZULU (senza distinzione tra maiuscole e minuscole) per specificare che l'ora è in Tempo universale coordinato. Altri fusi orari possono essere specificati usando la variabile d'ambiente TZ.


(+1) per il suggerimento. Sfortunatamente, non si adatta naturalmente al mio flusso di lavoro. Ho una sceneggiatura che esegue un sacco di cose in sequenza e voglio assicurarmi che determinati passaggi non vengano avviati fino a certe volte. Questo può ovviamente essere convertito in qualcosa che usa crono at, ma sarebbe un dolore da gestire. Questo è il motivo per cui sto cercando qualcosa di sleepsimile. Per ora, ho scritto il mio.
NPE,

Ah, quindi vuoi un programma di blocco. Perché non avere un file di stato che tenga traccia di ogni passaggio del processo?
Jeremy L

Potrebbe fare, ma sembra un po 'più complicato di quanto penso debba essere. I passaggi sono comandi disparati e lo script della shell è ciò che orchestra il flusso di lavoro. Essere in grado di "dormire fino alle 17:00" nella sceneggiatura è tutto ciò di cui ho veramente bisogno.
NPE,

In tal caso, la risposta di w00t potrebbe essere esattamente ciò che stai cercando.
Jeremy L

Sì, è decisamente nello spirito giusto. Purtroppo, si rompe in alcuni casi importanti (per me) e non fa fusi orari.
NPE,
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.