Unix: dormir jusqu'à l'heure spécifiée

12

Existe-t-il une commande Unix (semi-) standard qui dormirait jusqu'à l'heure spécifiée sur sa ligne de commande? En d'autres termes, je recherche quelque chose de similaire sleepqui prendrait du temps de réveil plutôt que de la durée.

Par exemple: sleeptill 05:00:00

Je peux coder quelque chose, mais je préfère ne pas réinventer la roue s'il y a déjà quelque chose.

Question bonus: ce serait génial si cela pouvait prendre le fuseau horaire (comme dans sleeptill 05:00:00 America/New_York).

modifier En raison de la nature de ce que je fais, je recherche une solution "dormir jusqu'à T" plutôt que "exécuter la commande à T".

edit Pour éviter tout doute, si j'exécute la commande à 18h00 et lui dis de se réveiller à 17h00, je m'attends à ce qu'elle reste en veille pendant 23 heures (ou, dans certains cas, dans le cas de l'heure d'été, pendant 22 ou 24 heures.)

NPE
la source
Vous pourriez utiliser cron, je suppose.
Bobby
Merci, mais pour l'usage prévu, il doit vraiment être sleepsemblable.
NPE

Réponses:

18

Si vous utilisez un Unix doté d'une commande de date décente et que vous utilisez bash, vous pouvez utiliser le format% s pour calculer l'heure.

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

(1700 étant 5PM et -j indiquant la date pour ne pas réellement régler la date)

w00t
la source
(+1) pour la suggestion. Si j'exécute la commande à 18h00 et que je lui dis de se réveiller à 17h00, je m'attends à ce qu'elle reste en veille pendant 23 heures (ou, dans certains cas, dans le cas de l'heure d'été, pendant 22 ou 24 heures). C'est là que la suggestion tombe malheureusement en panne. [J'ai également dû changer le -jpour -dle faire fonctionner sur mes systèmes Linux.]
NPE
7
@aix: Sous Linux (et d'autres systèmes avec date GNU), vous pouvez utiliser des spécifications de date sophistiquées telles que date -d 'tomorrow 17:00'.
Gilles 'SO- arrête d'être méchant'
3
@NPE, btw, on peut compenser en utilisant le rappel-division: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(il pourrait y avoir seulement quelques problèmes autour des changements d'heure d'été)
hvr
13

Qu'en est-il de cela (en combinant les idées de w00t et de Gille dans une fonction)?

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

Usage:

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
Tyler Rick
la source
9

Découvrez la atcommande linux / unix . En utilisant l'exemple 5AM:

at 05:00 some_command

Il prend également en charge les fuseaux horaires:

Un nom de fuseau horaire GMT, UCT ou ZULU (insensible à la casse) peut suivre pour spécifier que l'heure est en temps universel coordonné. D'autres fuseaux horaires peuvent être spécifiés à l'aide de la variable d'environnement TZ.

Jeremy L
la source
(+1) pour la suggestion. Malheureusement, cela ne rentre pas naturellement dans mon flux de travail. J'ai un script qui exécute un tas de choses en séquence, et je veux m'assurer que certaines étapes ne démarrent qu'à certaines heures. Cela peut bien sûr être converti en quelque chose qui utilise cronou at, mais ce serait pénible à gérer. C'est la raison pour laquelle je recherche quelque chose de sleepsemblable. Pour l'instant, j'ai écrit le mien.
NPE
Ah, vous voulez donc un calendrier de blocage. Pourquoi ne pas avoir un fichier d'état pour suivre chaque étape du processus?
Jeremy L
Pourrait le faire, mais cela semble un peu plus compliqué que je ne le pense. Les étapes sont des commandes disparates, et le script shell est ce qui orchestre le flux de travail. Pouvoir "dormir jusqu'à 17h" dans le script est tout ce dont j'ai vraiment besoin.
NPE
Dans ce cas, la réponse de w00t peut être précisément ce que vous recherchez.
Jeremy L
Oui, c'est définitivement dans le bon esprit. Malheureusement, il tombe en panne dans certains cas importants (pour moi) et ne fait pas de fuseaux horaires.
NPE