ntpdate已被弃用,因权限失败、硬件时钟不同步和服务冲突三类问题无法单独一行运行;需配合root权限、多源重试、hwclock写入及停用冲突服务才可靠。

直接用 ntpdate + cron 写脚本最简单,但要注意它已被弃用、不兼容 systemd-timesyncd 或 chrony 同时运行,且无法处理大偏差时间。
为什么不能只写 ntpdate 一行命令就完事
很多人复制粘贴 ntpdate ntp.aliyun.com 就以为同步完成了,实际会遇到三类典型问题:
- 权限失败:非 root 用户执行报
no server suitable for synchronization found - 硬件时钟不同步:系统时间改了,但 BIOS 时间没更新,重启后又偏移
- 服务冲突:如果系统已启用
systemd-timesyncd或chronyd,ntpdate会因端口占用失败,报错no server suitable for synchronization found或socket: Address already in use
一个可用的最小可靠脚本(含日志和容错)
以下脚本在 CentOS/RHEL 7+ 和 Ubuntu 16.04+ 上验证通过,不依赖额外服务,仅需 ntpdate 和 hwclock:
#!/bin/bash # /usr/local/bin/ntp-sync.sh LOG="/var/log/ntp-sync.log" echo "[$(date '+%F %T')] START" >> "$LOG" <h1>检查是否 root</h1><p>if [ "$EUID" -ne 0 ]; then echo "[$(date '+%F %T')] ERROR: must run as root" >> "$LOG" exit 1 fi</p><h1>停止可能冲突的服务(可选,按需启用)</h1><h1>systemctl is-active --quiet chronyd && systemctl stop chronyd</h1><h1>systemctl is-active --quiet systemd-timesyncd && systemctl stop systemd-timesyncd</h1><h1>尝试多个国内源,避免单点失败</h1><p>for server in ntp.aliyun.com ntp.tencent.com ntp.ntsc.ac.cn; do if /usr/sbin/ntpdate -u "$server" >/dev/null 2>&1; then echo "[$(date '+%F %T')] SUCCESS: synced with $server" >> "$LOG" /sbin/hwclock -w # 写入硬件时钟 exit 0 fi done</p><p>echo "[$(date '+%F %T')] FAILED: all NTP servers unreachable" >> "$LOG"</p>
关键点:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
/usr/sbin/ntpdate -u的-u参数绕过特权端口限制,适合普通用户临时调用(但脚本仍需 root 权限写硬件时钟) - 多个
server顺序尝试,避免单个域名解析失败或不可达导致整个脚本退出 -
/sbin/hwclock -w必须紧跟成功同步之后,否则重启即失效 - 注释掉的
systemctl stop行是为兼容性准备的——如果你确认没开其他时间服务,可以删掉;开了就得停,否则ntpdate必败
cron 定时任务怎么写才不踩坑
常见错误是写成 0 * * * * ntpdate ntp.aliyun.com,这会因权限、路径、环境变量缺失而静默失败。正确写法必须显式指定:
- 绝对路径:
/usr/sbin/ntpdate,不是ntpdate - 完整命令链:
/usr/sbin/ntpdate -u ntp.aliyun.com && /sbin/hwclock -w - 加 root 权限:编辑 root 的 crontab(
sudo crontab -e),不要用普通用户 crontab - 重定向输出:加
>/dev/null 2>&1或写入日志,否则 cron 会发邮件告警(多数服务器未配 mail 服务,导致堆积失败任务)
推荐写法(每 2 小时同步一次):
0 */2 * * * /usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1 && /sbin/hwclock -w
更现代的替代方案:用 chrony 替代脚本
如果你的系统是 CentOS 7+/RHEL 8+ 或 Ubuntu 16.04+,chrony 是默认推荐方案,比写脚本更可靠:
- 自动处理时间大偏差(比如虚拟机休眠后时间跳变)
- 无需手动写 cron,启动即持续同步
- 配置简单:
server ntp.aliyun.com iburst加一行就行 - 检查状态只需
chronyc tracking和chronyc sources -v,不用自己解析日志
真正需要手写脚本的场景,其实只剩两种:老系统(CentOS 6)、或必须强制跳变时间(如测试环境初始化)。其余情况,直接 sudo apt install chrony + 改 /etc/chrony.conf + sudo systemctl restart chrony 就够了。
脚本本身不难,难的是判断当前系统是否真的需要它——多数人抄了脚本却没关掉已启用的 chronyd 或 systemd-timesyncd,结果脚本永远失败,还找不到原因。










