临时更改时间


18

我需要测试仅在一天的特定时间发生的软件方面。我不想改变一整天(要在凌晨2:00到达这里),而是想更改时间。

但是我不想永久改变它。

我知道我可以使用更改时间date,然后再次更改,但是还有更好的方法吗?

有问题的操作系统是RHEL6在VM中运行。


出于价值考虑,我暂时无法更改VM中的时间,但是独立系统没有任何问题。可能值得一读:在Ubuntu上禁用时间同步
GrandAdmiral,2013年

Answers:


24

有一个库libfaketime(也在GitHub上),该库使您可以使系统向应用程序报告给定的时间。您可以让系统在程序执行期间报告固定时间,也可以在某个特定时间(例如01:59:30)启动时钟。基本上,您是通过库加载程序将faketime库连接到程序的内存映像中,并且它以自己的方式捕获和处理与系统时间相关的所有系统调用。它不会完全改变系统时间,但是会改变报告给特定应用程序的时间,而不会影响正在运行的其他任何东西,这可能就是您真正想要的(否则,我认为没有理由不仅仅改变全局时间系统时间)。

关于如何使用它,有许多可能的变体,但是看起来像使用libfaketime更改进程认为的时间一样,它列出了相当详尽的清单,并提供了示例代码来进行尝试。如果您知道要搜索的内容,那么Google应该也可以发掘一些示例。

似乎无法通过RHEL存储库对其进行预打包,但是例如Debian在软件包名称下提供了它faketime。它也可以直接从源代码进行构建(显然甚至不需要任何configure步骤或类似的操作)。


1
我可以找到的任何Fedora / CentOS / RHEL仓库都没有此的预构建。这里有此RPM,但需要为CentOS重建。
slm

@slm可惜,但是,从源代码构建起来应该不难(未经尝试即表示)。
CVn

1
不,我只是想让所有人都知道,以免他们外貌。看起来很简单。
slm

6

我要做的是首先安装ntp服务以与远程服务器同步时间。然后,停止服务,手动更改日期,播放并重新启动服务:

service ntpd stop
date -s "Aug 11 2012"
[ do stuff ]
service ntpd start

1
“据我所知,您不能仅更改一个进程的时间,因为这是系统范围的事情。” 实际上,您可以通过某种方式实现;看我的答案。
CVn

2
@MichaelKjörling的确如此,但是在撰写本文时,我的知识并没有扩展到您的答案。据我所知没有办法:)。
terdon

在您发布答案之前,我已将答案发布了大约90秒。;)
CVn

1
@MichaelKjörling是的,我实际上编辑了我的(您看不到,它是在我看到您的发布后立即完成的)以添加“据我所知” :)。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.