Временно изменить время

18

Мне нужно протестировать аспекты моего программного обеспечения, которые происходят только в определенное время дня. Вместо того, чтобы ждать целые дни (и приехать сюда в 2:00), я бы хотел изменить время.

Но я бы предпочел не менять его навсегда .

Я знаю, что могу изменить время с помощью date, а затем снова изменить его, но есть ли лучший способ?

Рассматриваемая ОС - это RHEL6, работающий на ВМ.

Джон Диблинг
источник
Что бы это ни стоило, у меня были проблемы с временным изменением времени внутри моей виртуальной машины, но у меня не было проблем с автономной системой. Возможно, стоит прочитать это: Отключите синхронизацию времени в Ubuntu
GrandAdmiral

Ответы:

24

Есть библиотека libfaketime(также на GitHub ), которая позволяет заставить систему сообщать приложению о заданном времени. Вы можете либо настроить системный отчет на фиксированное время на время выполнения программы, либо запустить часы в определенное время (например, 01:59:30). По сути, вы подключаете библиотеку faketime к образу вашей программы в памяти через загрузчик библиотеки, и она по-своему фиксирует и обрабатывает все системные вызовы, которые относятся к системному времени. Это точно не меняет системное время, но оно меняет время, сообщаемое вашему конкретному приложению, не затрагивая ничего, что работает, что, вероятно, то, что вы действительно ищете (в противном случае, я не вижу причин, чтобы просто изменить глобальное Системное время).

Существует несколько возможных вариантов его использования, но похоже, что изменение времени, в которое процесс думает, с помощью libfaketime содержит довольно подробный список вместе с примером кода, чтобы опробовать их. Google также сможет найти некоторые примеры, если вы знаете, что искать.

Может показаться, что он недоступен, предварительно упакованный через репозитории RHEL, но, например, Debian предоставляет его под именем пакетаfaketime . Это также выглядит просто для сборки из исходного кода (по-видимому, даже не требуется configureшаг или что-то в этом роде).

CVn
источник
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