Мы разработали внутреннее приложение с несколькими связанными с ним картами, которые выполняются в определенное время в течение дня. Эти кроны разработаны таким образом, что они гарантируют, что они игнорируют, например, выполнение до 7:00 утра или выполняются только один раз в день или неделю.
Этот конкретный подход выбран, чтобы гарантировать, что текущая задача не выполняется, когда никого нет в офисе (например), но также позволяет запускать каждые X минут, чтобы `` повторить попытку '', если cron каким-то образом не удалось выполнить (и обеспечивает выполнение, когда сервер имеет некоторое время простоя в качестве дополнительного бонуса).
Кроме того, некоторые части программного обеспечения полагаются на текущую системную дату, чтобы сообщить одному из используемых API-интерфейсов о некоторых действиях, таких как удаление удаленного объекта, срок действия которого истек в программе. Эти части вызываются кронами, каким-либо пользователем (где проверка выполняется в текущее время) или удаленным API.
Сейчас мы находимся на стадии тестирования этого приложения с несколькими конечными пользователями, и мы хотим создать полностью рабочую среду. Однако, поскольку для завершения большинства циклов в приложении требуется год или около того, мы ищем способы заставить серверное время «работать быстрее», то есть один день на минуту в реальном мире или около того. Однако нам также нужно посещать каждый час дня, чтобы убедиться, что все идет гладко. Фактически, серверное время будет увеличено в 1440 раз во время теста.
Есть ли какой-нибудь «хороший» способ сделать это на сервере Linux (CentOS) или это единственный способ позволить другому заданию cron увеличить время? Есть ли недостатки у такого подхода?
Вместо того, чтобы возиться с системными часами, я бы предложил использовать ложное время
Библиотека предварительной загрузки фиктивного времени (FTPL, также известная как libfaketime) перехватывает различные системные вызовы, которые программы используют для получения текущей даты и времени. Затем он может сообщать этим программам ложные даты и время (как указано вами, пользователем). Это означает, что вы можете изменять системное время, которое видит программа, без необходимости изменять время в масштабе всей системы. FTPL позволяет указывать как абсолютные даты (например, 2004-01-01), так и относительные даты (например, 10 дней назад).
Затем вы можете написать тестовый драйвер, который вызывает каждый из компонентов системы с соответствующим ложным временем.
На два похожих вопроса уже дан ответ Вот и Вот.
Самый лучший способ ускорить системные часы - использовать системные вызовы adjtime или adjtimex, но они настраивают часы очень медленно, чтобы не мешать процессам, полагающимся на точные временные интервалы.
Решение cronjob вызовет регулярный скачок времени, который, безусловно, будет мешать работе некоторых программ на вашем сервере (например, cron может не запустить задание, если часы перескочили через время, когда задание должно было быть запущено)