Alterar temporariamente o tempo

18

Preciso testar aspectos do meu software que só acontecem em determinados momentos do dia. Em vez de esperar dias inteiros (e chegar aqui às 2:00 da manhã), gostaria de mudar o horário.

Mas prefiro não alterá-lo permanentemente .

Sei que posso alterar o tempo usando datee depois alterá-lo novamente, mas existe uma maneira melhor?

O sistema operacional em questão é o RHEL6 em execução em uma VM.

John Dibling
fonte
Pelo que vale, tive problemas para alterar temporariamente o tempo dentro da minha VM, mas não tive nenhum problema com um sistema autônomo. Talvez valha a pena ler o seguinte: Desativar sincronização de tempo no Ubuntu
GrandAdmiral

Respostas:

24

Existe uma biblioteca chamada libfaketime(também no GitHub ) que permite que o sistema relate um determinado tempo ao seu aplicativo. Você pode solicitar que o sistema relate um horário fixo durante a execução do programa ou iniciar o relógio em um horário específico (por exemplo, 01:59:30). Basicamente, você conecta a biblioteca faketime à imagem na memória do programa por meio do carregador de bibliotecas, e ele captura e manipula à sua maneira todas as chamadas do sistema relacionadas à hora do sistema. Ele não altera exatamente o horário do sistema, mas altera o horário relatado para o seu aplicativo específico sem afetar qualquer outra coisa em execução, que provavelmente é o que você realmente procura (caso contrário, não vejo motivo para não apenas mudar o global hora do sistema).

Existem várias variantes possíveis de como usá-lo, mas parece que Alterar a hora em que um processo pensa que é com o libfaketime tem uma lista bastante completa, juntamente com o código de amostra para testá-los. O Google também deve conseguir descobrir alguns exemplos, pois você sabe o que procurar.

Parece que ele não está disponível pré -empacotado nosfaketime repositórios RHEL, mas, por exemplo, o Debian fornece sob o nome do pacote . Também parece simples construir a partir do código-fonte (aparentemente nem precisa de uma configureetapa ou algo do tipo).

um CVn
fonte
11
Não existe uma pré-construção disso em nenhum repositório do Fedora / CentOS / RHEL que eu possa encontrar. Há esse RPM disponível aqui, mas precisará ser reconstruído para o CentOS.
slm
@ Slm Pena, que, mas não deve ser difícil construir a partir da fonte (disse sem ter tentado).
um CVn 02/08/19
11
Não, eu estava apenas deixando todos saberem para salvá-los de olhar. Parece bem direto.
slm
6

O que eu faria é instalarntp primeiro um serviço para sincronizar o tempo com um servidor remoto. Em seguida, pare o serviço, altere manualmente a data, brinque e reinicie o serviço:

service ntpd stop
date -s "Aug 11 2012"
[ do stuff ]
service ntpd start
terdon
fonte
11
"Até onde eu sei, você não pode mudar o tempo de apenas um processo, porque é uma coisa do sistema inteiro". Na verdade, você pode, de certa forma; veja minha resposta.
um CVn 02/08/19
2
@ MichaelKjörling, de fato, mas meu conhecimento na época em que escrevi não se estendeu à sua resposta. Tanto quanto eu sabia, não há como :).
terdon
Postei minha resposta aproximadamente 90 segundos antes de você postar a sua. ;)
um CVn
11
@ MichaelKjörling sim, e eu realmente editei o meu (você não pode vê-lo, foi feito logo após postar quando vi o seu) para adicionar o "tanto quanto eu sei" :).
terdon