Como dormir até uma determinada data e hora?

5

Eu quero escrever um shell onde é dada uma data (dia-hora-min), por exemplo,

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

Ele dorme até essa data exata & Tempo. Eu pensei que uma maneira de fazer isso é, eu poderia pegar a data atual e calcular a diferença? então converta isso em segundos e durma durante esse tempo.

No entanto, não tenho muita certeza de como você pode fazer isso usando scripts de shell?

#!/bin/bash

now=$(date '+%A %W %Y %X')
date =  2:30 PM Mon

difference = ??
sleep difference
    
por user 03.02.2016 / 19:59

3 respostas

8

se o usuário tiver permissão para usar o comando at , esse é o uso perfeito para isso:

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

se você receber uma mensagem como "o usuário blah não é capaz de executar at ", peça ao syadmin para adicionar este usuário ao arquivo at.allow ou remover do arquivo at.deny , dependendo de como ele é usado no seu meio ambiente.

A menos que você deseje que o sono duradouro aconteça no meio do seu roteiro. Mesmo assim, você pode cortar o seu script em dois, escrever variáveis que deseja manter, em um arquivo e quando chegar a hora e a segunda parte do seu script for executada, ele poderá ler essas variáveis do arquivo armazenado.

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

GNU date permite que você especifique o formato da saída, bem como a data a ser exibida. Então eu uso a string de formato "% s" para obter o tempo em segundos desde a época, e o mesmo para o tempo arbitrário usando o -d paramater. Obtenha a diferença e você terá o intervalo para dormir.

A verificação de uma data no passado é deixada como um exercício para o leitor.

    
por 03.02.2016 / 20:32
1

Embora provavelmente você deva usar at como já sugerido, às vezes acho útil o seguinte ao trabalhar com problemas de tempo. Eu abreviei alguns, mas o link está lá.

Seconds Since the Epoch

A value that approximates the number of seconds that have elapsed since the Epoch. A Coordinated Universal Time name (specified in terms of seconds, minutes, hours, days since January 1 of the year, and calendar year minus 1900) is related to a time represented as seconds since the Epoch, according to the expression below.

If the year is <1970 or the value is negative, the relationship is undefined. If the year is >=1970 and the value is non-negative, the value is related to a Coordinated Universal Time name according to the C-language expression, where all variables are integer types:

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

Note:

The last three terms of the expression add in a day for each year that follows a leap year starting with the first leap year since the Epoch. The first term adds a day every 4 years starting in 1973, the second subtracts a day back out every 100 years starting in 2001, and the third adds a day back in every 400 years starting in 2001. The divisions in the formula are integer divisions; that is, the remainder is discarded leaving only the integer quotient.

    
por 04.02.2016 / 00:41