Modifier temporairement l'heure

18

Je dois tester des aspects de mon logiciel qui ne se produisent qu'à certains moments de la journée. Plutôt que d'attendre des journées entières (et d'arriver ici à 2 h 00), je voudrais changer l'heure.

Mais je préfère ne pas le changer définitivement .

Je sais que je peux changer l'heure en utilisant date, puis la modifier à nouveau, mais y a-t-il une meilleure façon?

Le système d'exploitation en question est RHEL6 exécuté sur une machine virtuelle.

John Dibling
la source
Pour ce que ça vaut, j'ai eu du mal à changer temporairement l'heure à l'intérieur de ma VM, mais je n'ai eu aucun problème avec un système autonome. Il vaut peut-être la peine de lire ceci: Désactiver la synchronisation de l'heure sur Ubuntu
GrandAdmiral

Réponses:

24

Il existe une bibliothèque appelée libfaketime(également sur GitHub ) qui vous permet de faire rapport du système à une heure donnée à votre application. Vous pouvez soit demander au système de signaler une heure fixe pour la durée de l'exécution du programme, soit démarrer l'horloge à une heure spécifique (par exemple, 01:59:30). Fondamentalement, vous connectez la bibliothèque faketime à l'image en mémoire de votre programme via le chargeur de bibliothèque, et il capture et gère à sa manière tous les appels système liés à l'heure système. Il n'a pas exactement changer l'heure du système, mais il change l' heure est signalé à votre application spécifique sans affecter tout ce qui est en cours d' exécution, ce qui est probablement ce que vous êtes vraiment après (sinon, je ne vois aucune raison de ne pas simplement changer le monde Le temps du système).

Il existe un certain nombre de variantes possibles sur la façon de l'utiliser, mais il semble que Changer l'heure à laquelle un processus pense qu'il est avec libfaketime a une liste assez complète avec un exemple de code pour les essayer. Google devrait également être en mesure de dénicher quelques exemples, étant donné que vous savez quoi rechercher.

Il semblerait qu'il ne soit pas disponible préemballé via les référentiels RHEL, mais par exemple Debian le fournit sous le nom du paquetfaketime . Il semble également simple de construire à partir du code source (il n'a apparemment même pas besoin d'une configureétape ou de quelque chose comme ça).

un CVn
la source
1
Il n'y a pas de pré-construction de cela dans les dépôts Fedora / CentOS / RHEL que j'ai pu trouver. Ce RPM est disponible ici, mais il devra être reconstruit pour CentOS.
slm
@slm Dommage, ça, mais ça ne devrait pas être difficile de construire à partir des sources (dit sans avoir essayé).
un CVn
1
Non, je faisais juste savoir à tout le monde pour les empêcher de regarder. Cela semble assez simple.
slm
6

Ce que je ferais, c'est d'abord installer un ntpservice pour synchroniser l'heure avec un serveur distant. Ensuite, arrêtez le service, modifiez manuellement la date, jouez et redémarrez le service:

service ntpd stop
date -s "Aug 11 2012"
[ do stuff ]
service ntpd start
terdon
la source
1
"Pour autant que je sache, vous ne pouvez pas changer l'heure pour un seul processus car c'est une chose à l'échelle du système." En fait, vous pouvez, en quelque sorte; voir ma réponse.
un CVn
2
@ MichaelKjörling en effet, mais mes connaissances au moment de la rédaction ne se sont pas étendues à votre réponse. Pour autant que je sache, il n'y a aucun moyen :).
terdon
J'ai posté ma réponse environ 90 secondes avant de poster la vôtre. ;)
un CVn du
1
@ MichaelKjörling yup, et j'ai en fait édité le mien (vous ne pouvez pas le voir, il a été fait juste après la publication quand j'ai vu le vôtre) pour ajouter le "autant que je sache" :).
terdon