Unix: dormir hasta el tiempo especificado


12

¿Existe un comando (semi) estándar de Unix que duerma hasta el tiempo especificado en su línea de comando? En otras palabras, estoy buscando algo similar sleepque tomaría tiempo de despertar en lugar de duración.

Por ejemplo: sleeptill 05:00:00

Puedo codificar algo, pero prefiero no reinventar la rueda si ya hay algo por ahí.

Pregunta adicional: sería genial si pudiera tomar la zona horaria (como en sleeptill 05:00:00 America/New_York).

editar Debido a la naturaleza de lo que estoy haciendo, estoy buscando una solución "dormir hasta T" en lugar de "ejecutar comando en T".

editar Para evitar dudas, si ejecuto el comando a las 18:00 y le digo que se despierte a las 17:00, espero que duerma durante 23 horas (o, en algunos casos, que tenga que ver con el horario de verano, por 22 o 24 horas.)


Podrías usar cron, supongo.
Bobby

Gracias, pero para el uso previsto, realmente tiene que ser sleepsimilar.
NPE

Respuestas:


18

Si está en un Unix que tiene un comando de fecha decente y está usando bash, puede usar el formato% s para calcular el tiempo.

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

(1700 son las 5PM y -j indica la fecha para no establecer la fecha)


(+1) por la sugerencia. Si ejecuto el comando a las 18:00 y le digo que se despierte a las 17:00, espero que duerma durante 23 horas (o, en algunos casos, que tenga que ver con el horario de verano, durante 22 o 24 horas). Aquí es donde lamentablemente la sugerencia se rompe. [También tuve que cambiar el -jpara -dhacer que se ejecute en mis sistemas Linux.]
NPE

77
@aix: en Linux (y otros sistemas con fecha GNU), puede usar especificaciones de fecha sofisticadas como date -d 'tomorrow 17:00'.
Gilles 'SO- deja de ser malvado'

3
@NPE, por cierto, se puede compensar mediante el uso de la división de recordatorio: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(puede haber solo algunos problemas relacionados con los cambios de DST)
hvr

13

¿Qué tal esto (combinando las ideas de w00t y Gille en una función)?

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

9

Echa un vistazo al atcomando linux / unix . Usando el ejemplo de las 5AM:

at 05:00 some_command

También es compatible con zonas horarias:

Puede seguir un nombre de zona horaria de GMT, UCT o ZULU (sin distinción entre mayúsculas y minúsculas) para especificar que la hora está en hora universal coordinada. Se pueden especificar otras zonas horarias utilizando la variable de entorno TZ.


(+1) por la sugerencia. Desafortunadamente, no encaja naturalmente en mi flujo de trabajo. Tengo un script que ejecuta un montón de cosas en secuencia, y quiero asegurarme de que ciertos pasos no se inicien hasta ciertos momentos. Por supuesto, esto se puede convertir en algo que use crono at, pero sería difícil de manejar. Esta es la razón por la que estoy buscando algo sleepparecido. Por ahora, he escrito el mío.
NPE

Ah, entonces quieres un horario de bloqueo. ¿Por qué no tener un archivo de estado haciendo un seguimiento de cada paso del proceso?
Jeremy L

Podría hacerlo, pero suena algo más complicado de lo que creo que debe ser. Los pasos son comandos dispares, y el script de shell es lo que organiza el flujo de trabajo. Ser capaz de "dormir hasta las 5pm" en el script es todo lo que realmente necesito.
NPE

En ese caso, la respuesta de w00t puede ser precisamente lo que buscas.
Jeremy L

Sí, definitivamente está en el espíritu correcto. Lamentablemente, se descompone en algunos casos importantes (para mí) y no hace zonas horarias.
NPE
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.