Cambiar temporalmente el tiempo

18

Necesito probar aspectos de mi software que solo suceden en ciertos momentos del día. En lugar de esperar días enteros (y llegar aquí a las 2:00 a.m.), me gustaría cambiar la hora.

Pero prefiero no cambiarlo permanentemente .

Sé que puedo cambiar el tiempo usando date, y luego volver a cambiarlo, pero ¿hay una mejor manera?

El sistema operativo en cuestión es RHEL6 ejecutándose en una VM.

John Dibling
fuente
Por lo que vale, tuve problemas para cambiar temporalmente el tiempo dentro de mi VM, pero no tuve ningún problema con un sistema independiente. Podría valer la pena leer esto: Deshabilitar la sincronización de tiempo en Ubuntu
GrandAdmiral

Respuestas:

24

Hay una biblioteca llamada libfaketime(también en GitHub ) que le permite hacer que el sistema informe un momento determinado a su aplicación. Puede hacer que el sistema informe una hora fija durante la ejecución del programa o iniciar el reloj a una hora específica (por ejemplo, 01:59:30). Básicamente, conecta la biblioteca de faketime a la imagen en memoria de su programa a través del cargador de la biblioteca, y captura y maneja a su manera todas las llamadas del sistema relacionadas con la hora del sistema. No cambia exactamente la hora del sistema, pero cambia la hora que se informa a su aplicación específica sin afectar nada más que se esté ejecutando, que es probablemente lo que realmente está buscando (de lo contrario, no veo ninguna razón para no solo cambiar el global hora del sistema).

Hay varias variantes posibles sobre cómo usarlo, pero parece que Cambiar la hora a la que un proceso cree que es con libfaketime tiene una lista bastante completa junto con un código de muestra para probarlos. Google también debería poder descubrir algunos ejemplos dado que usted sabe qué buscar.

Parece que no está disponible preempaquetado a través de los repositorios RHEL, pero por ejemplo Debian lo proporciona bajo el nombre del paquetefaketime . También parece sencillo construir desde el código fuente (aparentemente ni siquiera necesita un configurepaso o algo así).

un CVn
fuente
1
No hay una compilación previa de esto en ningún repositorio de Fedora / CentOS / RHEL que pueda encontrar. Hay este RPM disponible aquí, pero deberá reconstruirse para CentOS.
slm
@slm Lástima, eso, pero no debería ser difícil de construir desde la fuente (dicho sin haberlo intentado).
un CVn el
1
No, solo les estaba haciendo saber a todos para salvarlos de mirar. Se ve bastante sencillo.
slm
6

Lo que haría es instalarntp primero un servicio para sincronizar la hora con un servidor remoto. Luego, detenga el servicio, cambie manualmente la fecha, juegue y reinicie el servicio:

service ntpd stop
date -s "Aug 11 2012"
[ do stuff ]
service ntpd start
terdon
fuente
1
"Hasta donde yo sé, no se puede cambiar el tiempo de un solo proceso porque es una cuestión de todo el sistema". En realidad, puedes, de alguna manera; mira mi respuesta
un CVn el
2
@ MichaelKjörling de hecho, pero mi conocimiento al momento de escribir esto no se extendió a su respuesta. Por lo que sabía, no hay manera :).
terdon
Publiqué mi respuesta aproximadamente 90 segundos antes de que publicaras la tuya. ;)
un CVn
1
@ MichaelKjörling, sí, y en realidad edité el mío (no puedes verlo, se hizo justo después de publicar cuando vi el tuyo) para agregar el "hasta donde yo sé" :).
terdon