在linux系统中,网络时间协议(ntp)用于保证服务器时间与标准时间源保持一致,很多业务场景都依赖准确的时间,因此查看ntp是否同步是日常运维中的常见操作。不同的linux发行版可能使用不同的时间同步服务,对应的查看方法也存在差异。

使用ntpq命令查看ntp同步状态
如果系统使用的是传统的ntp服务,可以通过ntpq命令查询同步状态,该命令是ntp服务的自带工具,能够显示与上游时间服务器的连接和同步情况。
执行以下命令可以查看ntp对等体状态:
# 查看ntp对等体列表,参数p表示显示对等体信息 ntpq -p
命令输出结果包含多个列,关键列的含义如下:
- remote:上游时间服务器的地址
- refid:上游服务器参考的时间源地址
- st:时间源的层级,层级越低优先级越高
- offset:本地时间与服务器时间的偏移量,单位为毫秒,数值越小同步越精准
- jitter:时间抖动量,数值越小表示时间越稳定
- reach:最近8次轮询的可达性,377表示8次全部可达
如果输出中有一行开头带有*符号,说明该服务器是当前正在使用的同步源,且同步状态正常。如果所有行都没有*符号,说明还没有完成同步。
使用chronyc命令查看同步状态
现在很多新的linux发行版(如CentOS 8、Ubuntu 20.04及以上版本)默认使用chrony作为时间同步服务,替代了传统的ntp服务,此时需要使用chronyc命令查看状态。
执行以下命令可以查看chrony的同步源状态:
# 查看chrony的同步源列表 chronyc sources
输出结果中,^*开头的行表示当前正在使用的同步源,^+表示候选同步源,^-表示被排除的同步源。如果看到^*开头的行,说明chrony已经完成同步。
还可以执行以下命令查看更详细的同步状态:
# 查看chrony的跟踪状态 chronyc tracking
输出中的Leap status字段如果显示Normal,说明时间同步正常;如果显示Not synchronised,说明还没有完成同步。
查看系统时间和同步状态文件
除了使用专用命令,还可以通过查看系统相关文件判断ntp是否同步。
首先可以查看系统时间是否与本地时间一致,执行date命令查看当前系统时间,对比本地实际时间是否有明显偏差。
如果使用的是ntp服务,可以查看/var/lib/ntp/ntp.drift文件,该文件存在且内容不为0,说明ntp服务正在运行并计算时间漂移。如果使用的是chrony服务,可以查看/var/lib/chrony/chrony.drift文件,作用类似。
查看服务运行日志
通过查看时间同步服务的运行日志,也能判断同步是否正常。
对于ntp服务,日志通常存放在/var/log/ntp.log,或者可以通过journalctl -u ntp查看服务日志,搜索是否有synchronized to相关的成功同步记录。
对于chrony服务,执行journalctl -u chronyd查看日志,搜索Selected source相关的记录,确认是否成功选择了同步源。
同步异常排查思路
如果查看后发现ntp没有同步,可以按照以下步骤排查:
- 检查时间同步服务是否正常运行,执行
systemctl status ntp或者systemctl status chronyd查看服务状态 - 检查上游时间服务器地址是否配置正确,ntp的配置文件是
/etc/ntp.conf,chrony的配置文件是/etc/chrony.conf - 检查防火墙是否放行了ntp服务的123端口,ntp使用UDP 123端口进行通信
- 检查服务器是否能正常访问上游时间服务器,使用
ping 时间服务器地址测试网络连通性
代码示例:自动检查ntp同步状态脚本
可以编写一个简单的shell脚本,自动检查ntp同步状态并输出结果:
#!/bin/bash
# 检查是否安装chrony
if command -v chronyc >/dev/null 2>&1; then
echo "检测到chrony服务,正在检查同步状态..."
# 查看跟踪状态,判断是否正常同步
tracking_info=$(chronyc tracking 2>/dev/null)
if echo "$tracking_info" | grep -q "Leap status: Normal"; then
echo "chrony同步状态正常"
else
echo "chrony未同步,请检查服务状态"
fi
# 检查是否安装ntp
elif command -v ntpq >/dev/null 2>&1; then
echo "检测到ntp服务,正在检查同步状态..."
# 查看对等体状态,判断是否有*开头的同步源
peer_info=$(ntpq -p 2>/dev/null)
if echo "$peer_info" | grep -q "^*"; then
echo "ntp同步状态正常"
else
echo "ntp未同步,请检查服务状态"
fi
else
echo "未检测到ntp或chrony服务,请先安装时间同步服务"
fi
将上述脚本保存为check_ntp_sync.sh,添加执行权限后运行,即可快速判断当前系统的ntp同步状态。