服务器时间差了几分钟,定时任务和证书全乱套:先对时
服务器出怪事的时候,先看一眼时间——不是看表,是看机器自己的时间。时间差了几分钟,能闹出的乱子比想象中多:cron 明明设好了却不在预期的点跑;刚装好的证书浏览器报"证书尚未生效";两台机器的日志摆在一起,同一件事的时间戳对不上号;systemd 的定时器到点没动静。这些看起来不相干的症状,根子可能就一个:系统时间不准。
先查现状。`date` 看一眼当前时间,再跑 `timedatectl status`,重点看两行:`NTP synchronized` 是 yes 还是 no,`RTC time` 和系统时间差多少。如果 NTP synchronized 是 no,说明机器根本没在同步时间,时间全靠开机那一刻的硬件时钟撑着,一天漂几秒、一个月漂几分钟都很正常。
再查同步服务在不在干活。如果装的是 chrony,跑 `chronyc tracking`,看 `Leap status` 是不是 Normal、`Stratum` 是几、`Last offset` 是多少。offset 从几百毫秒慢慢收敛到几毫秒,才算真的同步上了。如果 offset 一直很大或者 `Leap status` 显示 Not synchronised,说明同步源有问题。没有 chrony 的机器,可以用 `ntpdate -q pool.ntp.org` 测一下能不能连上时间源——只测不改,安全。
连不上时间源,先查路通不通。NTP 走的是 UDP 123,不是 TCP,安全组和防火墙放行 TCP 123 没用,得放 UDP。云服务器还要看镜像默认开了什么:有的镜像默认没装 chrony,有的装了 systemd-timesyncd 但没启用。timesyncd 的开法很简单:`timedatectl set-ntp true`,再用 `timedatectl status` 确认 `NTP service` 变成 active。chrony 则是 `systemctl enable --now chrony`,开机自启和立即启动一次到位。
时间差得太大的时候,同步服务不会一步跳过去。chrony 默认认为几秒以上的偏差可能是人为调表,不会硬跳,这时候要先手动拨一次:`chronyd -q 'server pool.ntp.org iburst'` 或者直接用 `date` 设准,再开服务。拨完别忘了把时间写回硬件时钟:`hwclock -w`,否则重启之后又回到拨之前的时间。
还有几个容易踩的坑。虚拟机从快照恢复后,时间会回到快照那一刻,开机第一件事就是对时。双系统的机器,Linux 默认把硬件时钟当 UTC,Windows 默认当本地时间,两边来回切能差出 8 小时,排障时先确认时区设置 `timedatectl` 里的 `Time zone` 对不对。容器里改不了系统时间,对时要在宿主机上做,进容器里调是调不动的。
最后说一句排障习惯:日志时间戳对不上、先怀疑时间。查别的之前,先把 `date` 和 `timedatectl` 跑一遍,确认时间是对的,再往下查。对时是成本最低的排障第一步,几分钟的事,能省掉后面几小时的弯路。
- 点赞
- 收藏
- 关注作者
评论(0)