Unix: dorme até o tempo especificado


12

Existe um comando (semi-) padrão do Unix que duraria até o tempo especificado em sua linha de comando? Em outras palavras, estou procurando algo semelhante ao sleepque levaria tempo de ativação em vez de duração.

Por exemplo: sleeptill 05:00:00

Eu posso codificar algo, mas prefiro não reinventar a roda se já houver algo lá fora.

Pergunta do bônus: seria ótimo se pudesse levar o fuso horário (como em sleeptill 05:00:00 America/New_York).

edit Devido à natureza do que estou fazendo, estou procurando uma solução "durma até T" em vez de "executar comando em T".

edit Para evitar dúvidas, se eu executar o comando às 18:00 e pedir para que ele acorde às 17:00, espero que ele durma por 23 horas (ou, em alguns casos de canto relacionados ao horário de verão, por 22 ou 24 horas.)


Você poderia usar cron, eu acho.
— Bobby

Obrigado, mas para o uso pretendido, ele realmente deve ser sleepparecido.
— NPE

Respostas:


18

Se você estiver em um Unix com um comando de data decente e estiver usando o bash, poderá usar o formato% s para calcular o tempo.

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

(1700 sendo 17:00 e -j informando a data para não definir a data)


(+1) para a sugestão. Se eu executar o comando às 18:00 e pedir para que ele acorde às 17:00, espero que ele durma por 23 horas (ou, em alguns casos de canto relacionados ao horário de verão, por 22 ou 24 horas). É aqui que, infelizmente, a sugestão se desfaz. [Eu também tive que mudar o -jque -d. Para executá-lo em meus sistemas Linux]
— NPE

7
@aix: No Linux (e em outros sistemas com data GNU), você pode usar especificações sofisticadas de data , como date -d 'tomorrow 17:00'.
— Gilles 'SO- stop be evil'

3
@NPE, btw, pode-se compensar usando lembrete de-divisão: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(pode haver apenas algumas questões em torno de Hora de Verão alterações)
— HVR

13

Que tal isso (combinar as idéias de w00t e Gille em uma função)?

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

Confira o atcomando linux / unix . Usando o exemplo 05:00:

at 05:00 some_command

Ele também suporta fusos horários:

Um nome de fuso horário de GMT, UCT ou ZULU (sem distinção entre maiúsculas e minúsculas) pode ser seguido para especificar que o horário está no Horário Universal Coordenado. Outros fusos horários podem ser especificados usando a variável de ambiente TZ.


(+1) para a sugestão. Infelizmente, ele não se encaixa naturalmente no meu fluxo de trabalho. Eu tenho um script que executa várias coisas em sequência e quero garantir que certas etapas não sejam iniciadas até determinados momentos. Obviamente, isso pode ser convertido em algo que usa cronou at, mas seria difícil administrar. É por isso que estou procurando algo sleepparecido. Por enquanto, eu escrevi o meu.
— NPE 15/12

Ah, então você quer um horário de bloqueio. Por que não ter um arquivo de estado acompanhando cada etapa do processo?
— Jeremy L

Poderia fazer, mas parece um pouco mais complicado do que eu acho que precisa ser. As etapas são comandos diferentes e o shell script é o que orquestra o fluxo de trabalho. Ser capaz de "dormir até as 17h" no script é tudo o que realmente preciso.
— NPE

Nesse caso, a resposta da w00t pode ser exatamente o que você procura.
— Jeremy L

Sim, é definitivamente no espírito certo. Infelizmente, ele quebra em alguns casos importantes (para mim) e não faz fusos horários.
— NPE 15/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.