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.)

NPE
fonte
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)

w00t
fonte
(+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
Tyler Rick
fonte
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.

Jeremy L
fonte
(+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