Логи в одном времени, cron в другом, сертификат «ещё не действует». Разбираем timedatectl на живом сервере: пояс, синхронизация и проверка часов.
Бэкап «в три ночи» проходит в какое-то странное время, в журнале события идут не в том порядке, а apt вдруг заявляет, что репозиторий «ещё не действует». Почти всегда причина одна: часовой пояс сервера не тот, что вы думаете, или часы уехали. Разберём, как это увидеть и исправить командой timedatectl.
Коротко.
timedatectlбез аргументов показывает местное время, UTC, часовой пояс и главное:System clock synchronized: yes. Пояс меняетsudo timedatectl set-timezone Europe/Berlin, список имён даётtimedatectl list-timezones. Для серверов, которые обслуживают людей из разных стран, удобнее держать UTC. Точность обеспечивает служба синхронизации, на Ubuntu этоsystemd-timesyncd, и её проверяетtimedatectl timesync-status.
Что показывает timedatectl
Это штатная утилита systemd для времени: она читает и меняет часовой пояс, включает синхронизацию и ничего не требует ставить отдельно. Запустите её без аргументов (права администратора для чтения не нужны):
timedatectl
Вот реальный вывод с сервера на Ubuntu 24.04:
Читаем по строкам:
- Local time - время в поясе сервера. Именно по нему работают
date, расписание cron и подписи в большинстве программ. - Universal time - то же мгновение в UTC, мировом времени без сезонных переводов. Разница с местным - смещение пояса: здесь три часа (
+0300). - RTC time - часы на материнской плате (у виртуальной машины они эмулируются).
RTC in local TZ: noозначает, что в них хранится UTC, и это правильный вариант для Linux. - System clock synchronized: yes - часы сверены с серверами точного времени. Если здесь
no, остальное можно не читать: сначала чините синхронизацию. - NTP service: active - служба, которая эту сверку делает, запущена.
Как узнать часовой пояс сервера
Из вывода выше он виден в строке Time zone. Если нужна только эта строка, например для скрипта, спросите у системы напрямую:
timedatectl show -p Timezone --valueЗа этим именем стоит обычная ссылка. Пояс в Ubuntu и Debian задаёт файл /etc/localtime, который указывает на запись в базе часовых поясов:
ls -l /etc/localtime && cat /etc/timezoneНа нашем сервере получилось так:
Ссылка и /etc/timezone обычно совпадают. Если у вас они расходятся, руководствуйтесь ссылкой: её читает большинство программ.
Как поменять часовой пояс
Сначала найдите точное имя. Пояса называются «Континент/Город», а не «МСК» или «GMT+3»: так база помнит и сдвиг, и даты перехода на летнее время. Отфильтруйте список по нужному региону:
timedatectl list-timezones | grep Europe/В списке сотни строк, из них пригодятся буквально две-три: Europe/Berlin, Europe/Helsinki, Europe/Amsterdam и так далее. Выбрав имя, поменяйте пояс (эта команда требует прав администратора):
sudo timedatectl set-timezone Europe/BerlinБез sudo обычный пользователь увидит отказ: Failed to set time zone: Interactive authentication required. Это не ошибка в имени, а нехватка прав. После смены проверьте результат повторным timedatectl и перезапустите cron, чтобы задачи точно пошли по новому времени: sudo systemctl restart cron.
UTC или местное время
Короткий совет: если сервером пользуется одна команда в одной стране, ставьте её пояс, и расписание читается без пересчётов. Если логи читают люди из разных мест, сервер обслуживает клиентов в нескольких странах или вы собираетесь собирать журналы с нескольких машин в одно место, держите UTC. Главное преимущество - в UTC не бывает перевода часов: осенью час не повторяется дважды, весной не пропадает, а задача по расписанию не запускается дважды или ни разу.
Посмотреть время в любом поясе, не меняя системный, можно одной переменной окружения:
TZ=America/New_York date; TZ=UTC dateПеременная TZ действует только на эту команду. Удобно, когда нужно быстро понять, сколько сейчас у партнёра, не трогая настройки сервера.
Часы не должны уходить: синхронизация времени
Даже верный пояс не поможет, если сами часы врут. У виртуальной машины они уходят: хост занят, процесс остановился, снимок диска восстановили. Поэтому серверу нужна служба, которая раз в десятки минут сверяется с серверами точного времени по протоколу NTP (Network Time Protocol). Спросите у неё, как идут дела:
timedatectl timesync-statusТри строки важнее остальных:
- Server - с кем сверяются. По умолчанию на Ubuntu это
ntp.ubuntu.com. - Offset - на сколько часы расходились с сервером при последней сверке.
-639us- минус 0,6 миллисекунды. Для сервера любого сайта это идеально; тревожиться стоит, когда значение приближается к секундам. - Poll interval - как часто идёт сверка. 34 минуты - потолок: служба решила, что часы ведут себя ровно, и перестала дёргать сервер без нужды.
Если синхронизация выключена, включите её и снова загляните в timedatectl:
sudo timedatectl set-ntp trueНа Ubuntu работу делает systemd-timesyncd, лёгкая служба из состава systemd. Для сайта, бота и обычного сервера её точности хватает с запасом. Отдельный пакет chrony нужен там, где счёт идёт на доли миллисекунд или сервер сам раздаёт время другим машинам. Одновременно держать обе службы не нужно: при установке chrony пакет systemd-timesyncd обычно удаляется сам.
Что ломается, если время неверное
Сбои из-за часов выглядят как проблемы совсем в других местах, поэтому их долго ищут не там:
Что видите | Что на самом деле | Что делать |
|---|---|---|
| Часы отстают от репозитория | Проверить |
Браузер или | Сертификат проверяется по часам сервера | Сверить время и только потом смотреть на сам сертификат |
Коды двухфакторной защиты (TOTP) не подходят | Код живёт 30 секунд, и расхождение больше этого срока его ломает | Проверить |
Бэкап запускается «не в то время» | Пояс сервера не тот, что в голове | Посмотреть |
Записи в журналах разных серверов идут вразнобой | У машин разные пояса или часы | Привести всё к UTC и включить NTP везде |
Проверка за минуту
Есть простой способ убедиться, что часы не врут, не доверяя самой службе: сравнить время сервера с заголовком Date, который присылает любой сайт по HTTPS. Запросите только заголовки и сравните с date -u:
date -u; curl -sI https://www.ubuntu.com | grep -i "^date"Расхождение в секунду-две нормально, потому что команды выполняются не в один и тот же миг. Если разница в минуты и часы, ищите причину: отключённая синхронизация, заблокированный порт 123 в фаерволе (NTP работает по UDP) или неверный пояс, который вы приняли за дрейф часов. Журнал службы подскажет подробности, о чём мы писали в статье про journalctl: достаточно sudo journalctl -u systemd-timesyncd.
Частые вопросы
Как узнать часовой пояс сервера в Linux?
Выполните timedatectl и найдите строку Time zone. Коротко: timedatectl show -p Timezone --value выведет только имя пояса, например Europe/Berlin.
Как изменить часовой пояс в Ubuntu?
Найдите имя через timedatectl list-timezones | grep Город и выполните sudo timedatectl set-timezone Континент/Город. Затем проверьте результат повторным timedatectl.
Какой часовой пояс ставить на сервере: UTC или местный?
Для одной команды в одной стране подойдёт местный. Если сервис обслуживает разные страны или вы собираете логи с нескольких серверов, ставьте UTC: в нём нет перехода на летнее время и путаницы при разборе журналов.
Почему timedatectl показывает «System clock synchronized: no»?
Служба синхронизации выключена, не может достучаться до серверов времени или только что запустилась и ещё не успела сверить часы. Включите её через sudo timedatectl set-ntp true, проверьте, не закрыт ли исходящий UDP-порт 123, и подождите минуту.
Что лучше: chrony или systemd-timesyncd?
Для обычного сервера хватает systemd-timesyncd, он уже стоит в Ubuntu. chrony берут, когда нужна точность выше миллисекунд, когда сервер сам раздаёт время или когда сеть нестабильна.
Итог
timedatectl- главная команда: показывает местное время, UTC, пояс и состояние синхронизации.- Часовой пояс задаётся именем «Континент/Город» через
sudo timedatectl set-timezone, а сам выбор делайте исходя из того, кто читает логи. - Для серверов с разными пользователями и несколькими машинами удобнее UTC.
- Точность держит
systemd-timesyncd; смотрите наOffsetиSystem clock synchronized. - Неверное время маскируется под ошибки сертификатов,
apt, двухфакторной защиты и cron.
🎁 -40% на первый месяц нового VPS. Промокод GUIDE40
Нужен сервер под ваши задачи? Первый месяц со скидкой.
ВведитеGUIDE40при оформлении заказа. Работает один раз на клиента.
Выбрать VPS и забрать скидку →
