¿Cómo dormir hasta una date y hora determinada?

Quiero escribir un shell donde se le dé una date (día-hora-min), por ej.

10:00 AM Sun 2:30 PM Mon ... 

Duerme hasta esa date y hora exactas. Pensé que una forma de hacerlo es, ¿podría get la date actual y calcular la diferencia? luego convierte eso en segundos y duerme por ese time.

Sin embargo, no estoy muy seguro de cómo podría hacerlo utilizando scripts de shell.

 #!/bin/bash now=$(date '+%A %W %Y %X') date = 2:30 PM Mon difference = ?? sleep difference 

si el usuario puede usar at command, este es el uso perfecto para eso:

 $ at 08:00 022116 at> myscript.sh at> <----------- ctrl-d here job 9 at 2016-02-21 08:00 

si recibe un post como "usuario blah no puede ejecutar", solicite a syadmin que agregue este usuario a at.allow file at.allow o elimínelo del file at.deny , según cómo se use en su entorno.

A less, por supuesto, que desees que el sueño prolongado ocurra en el medio de tu guión. Incluso entonces puede cortar su secuencia de commands en dos, escribiendo las variables que desea conservar, en un file y cuando llegue el momento y se ejecute la segunda parte de su secuencia de commands, podrá leer esas variables del file almacenado.

 #!/bin/bash NOW=$(date +"%s") SOON=$(date +"%s" -d "3:00 PM Sun") INTERVAL=$(($SOON-$NOW)) sleep $INTERVAL 

La date GNU le permite especificar el formatting de la salida, así como la date para mostrar. Así que utilizo la cadena de formatting "% s" para get el time en segundos desde la época, y lo mismo para el time arbitrario usando el parámetro -d . Obtenga la diferencia, y tiene el intervalo para dormir.

La comprobación de una date en el pasado se deja como un ejercicio para el lector.

Si bien probablemente deba utilizar at igual que lo sugerido, a veces encuentro útil lo siguiente cuando trabajo con problemas de time. Lo he resumido un poco, pero el enlace está allí.

Segundos desde la época

Un valor que se aproxima a la cantidad de segundos transcurridos desde la Época. Un nombre de hora universal coordinada (especificado en términos de segundos, m inutos, hnos, d ays desde el 1 de enero del año y calendar y oído less 1900) está relacionado con un time representado como segundos desde la Época, de acuerdo con el expresión a continuación.

Si el año es <1970 o el valor es negativo, la relación no está definida. Si el año es> = 1970 y el valor no es negativo, el valor se relaciona con un nombre de hora universal coordinada según la expresión del lenguaje C, donde todas las variables son types integers:

 s + m*60 + h*3600 + d*86400 + (y-70)*31536000 + ((y-69)/4)*86400 - ((y-1)/100)*86400 + ((y+299)/400)*86400 

Nota :

Los últimos tres términos de la expresión se sumn en un día para cada año que sigue a un año bisiesto que comienza con el primer año bisiesto desde la Época. El primer término agrega un día cada 4 años a partir de 1973, el segundo resta un día cada 100 años a partir de 2001, y el tercero agrega un día cada 400 años a partir de 2001. Las divisiones en la fórmula son divisiones enteras ; es decir, el rest se descarta dejando solo el cociente integer.