如何使用ntp强制更新时钟?


377

我在缺乏电池支持的RTC的基于ARM的嵌入式系统上运行Ubuntu。唤醒时间在1970年左右。因此,我使用NTP服务将时间更新为当前时间。

我在/etc/rc.local文件中添加了以下行:

sudo ntpdate -s time.nist.gov

但是,启动后,更新时间仍然需要几分钟,在此期间,我无法有效地使用tarmake

如何在任何给定时间强制更新时钟?


更新1:以下命令(由于Eric和Stephan)在命令行中可以正常工作,但是在放入时无法更新时钟/etc/rc.local

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; date
Thu Jan  1 00:00:58 UTC 1970
 * Stopping NTP server ntpd     [ OK ] 
 * Starting NTP server          [ OK ] 
Thu Feb 14 18:52:21 UTC 2013

我究竟做错了什么?


更新2:我尝试遵循针对第一次更新提出的一些建议,但是似乎并没有实际完成所需的工作。这是我尝试过的:

  1. 将服务器更换为 us.pool.ntp.org
  2. 使用程序的显式路径
  3. ntp完全删除服务,只留sudo ntpdate ...rc.local
  4. sudo从上述命令中删除rc.local

使用上述方法,机器仍然从1970年开始。但是,一旦在命令行中登录(通过ssh)来执行此操作,则在我调用时,时钟就会更新ntpdate

最后一件事,我所做的就是从删除rc.local和拨打电话到ntpdate我的.bashrc文件。这确实会按预期更新时钟,并且在命令提示符可用时,我会获得真实的当前时间。

但是,这意味着如果机器打开且没有用户登录,则时间永远不会更新。当然,我可以重新安装该ntp服务,以便至少在启动后的几分钟内更新时钟,但是随后我们回到了方格1。

那么,有没有理由为什么将ntpdate命令放入rc.local不能执行所需的任务而又能.bashrc正常工作呢?


2
从[这里] [1]: ntpdate -s ntp.ubuntu.com [1]:askubuntu.com/a/81301/130162
18446744073709551615

4
注意ntpdate上的“ -b”标志。在ntpdate的手册页中:“强制使用settimeofday()系统调用来逐步执行时间,而不是使用adjtime()系统调用来压摆(默认)。当在启动时从启动文件中调用此选项时,应该使用此选项。” 下面的许多答案都不包括它,这可能是使事情正常运行的部分问题。认为该“-B”标志它提到,在128毫秒偏移可能需要数小时使用默认的“摆”同步机制
马特S.

无需sudo在/etc/rc.locale文件中使用..它们都已作为root运行。
索伦

Answers:


325

ntp服务可能正在运行,这就是为什么ntpdate无法打开套接字(端口123 UDP)并连接到ntp服务器的原因。

从命令行尝试:

sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start

如果要/etc/rc.local使用此功能,请执行以下操作:

( /etc/init.d/ntp stop
until ping -nq -c3 8.8.8.8; do
   echo "Waiting for network..."
done
ntpdate -s time.nist.gov
/etc/init.d/ntp start )&

谢谢。您能解释一下为什么需要显式路径吗?
ysap

1
我真的不知道 :-)曾经尝试service从rc.local和cron 运行时遇到了麻烦,但是我设法改用/etc/init.d/xxx进行了修复。实际上,我认为您不必提供的完整路径ntpdate,我喜欢在脚本中使用完整路径,只是为了确保找到正确的文件。
埃里克·卡瓦略

2
好的,这显然是问题所在。现在,一旦建立网络连接,时钟就会更新。谢谢。
ysap

3
我确实发现us.pool.ntp.org响应速度更快。
ysap

7
使用该-u选项,您无需停止ntp服务:sudo ntpdate -u time.nist.gov
Edward Anderson

486

代替ntpdate(已弃用),请使用

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

-gq告诉NTP守护进程来校正时间无论偏移(的g立即)和出口(q设定时间后)。


3
谢谢。在此命令后(w / sudo)仍显示1970。在阅读ntpd联机帮助页时,我不确定这是如何强制进行更新的?
ysap

12
“ -q”选项告诉NTP守护程序启动,设置时间并立即退出。“ -g”选项允许它校正大于1000秒的时间差。从长远来看,您只需将NTP守护程序配置为始终运行。
tgharold 2013年

35
该答案应该排在最前面,因为它是正确的:不建议使用ntpdate,并且安装它不是一个好主意,因为它与ntp冲突。如果时钟不正确,则需要执行此手动步骤,因为否则ntp不会更改时钟,也不会告诉您原因。
利亚姆

31
对我来说,sudo ntpd -gq不退出!我在14.10上,必须按CTRL + C才能继续...或者应该花多长时间?
Yanick Rochon 2015年

5
仅供参考,在我的系统(CentOS 6.6)上,我需要将的两个实例更改sudo service ntp...sudo service ntpd...
rinogo 2015年

63

使用sntp立即设置时间。例如:

sudo sntp -s 24.56.178.140

-s之后的数字可以是任何ntp时间服务器,其中一个是Ft中的NIST。科罗拉多州柯林斯。


1
可行!+1
CappY 2015年

7
当“ sudo ntpd -gq”不起作用时,此方法起作用。
马特·怀特

我不知道我来过多少次了。每次都能工作。
2016年

1
无法找到软件包sntp?
寺庙

1
apt-get install sntp / yum install sntp(是的,它也适用于CentOS,RedHat,Fedore)
ndemou

40

正如其他人指出的,最佳解决方案是指示ntpd忽略恐慌阈值,默认情况下为1000秒。您可以通过以下两种方式之一配置紧急阈值:

  • 编辑/etc/default/ntp并确保-g选项存在。
  • 编辑/etc/ntp.conf并放在tinker panic 0顶部

到目前为止,这基本上是其他人的建议,但是我认为您应该采取进一步的措施。安装fake-hwclock程序:

# apt-get install fake-hwclock


fake-hwclock: Save/restore system clock on machines without working RTC hardware

 Some machines don't have a working realtime clock (RTC) unit, or no
 driver for the hardware that does exist. fake-hwclock is a simple set
 of scripts to save the kernel's current clock periodically (including
 at shutdown) and restore it at boot so that the system clock keeps at
 least close to realtime. This will stop some of the problems that may
 be caused by a system believing it has travelled in time back to
 1970, such as needing to perform filesystem checks at every boot.

 On top of this, use of NTP is still recommended to deal with the fake
 clock "drifting" while the hardware is halted or rebooting.

安装了fake-hwclock后,您的计算机就不会再以1970年的形式启动。当您的计算机启动时,它将其时钟设置为上次重新引导/关闭期间写入的时间戳false-hwclock。这意味着您可以使用一个稍微正确的时钟,以防启动时出现网络问题。


1
-g似乎什么都不做,我(在命令行中,我没有/etc/default/ntp),但添加tinker panic 0ntp.conf工作
戴维高柏灵参赞

@Sahuagin除了您有非标准的ntp软件包以外,我不知道该告诉您什么。/ etc / default / ntp是Ubuntu 软件包的一部分:packages.ubuntu.com/xenial/amd64/ntp/filelist,而-g在我记忆中一直是一个选项。
dfc

抱歉,我想我实际上不在Ubuntu上,在发表评论之前应该多想一点。tinker panic 0绝对似乎已经工作了。
Dave Cousineau

13

ntpdate是一个与net dameon不同的程序。NTPDate可能在启动时出错,因为该套接字上正在运行ntpd。

从命令行运行

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

您也可以一起卸载ntpd(apt-get remove ntp)并添加cron脚本以每小时大约使用ntpdate。

更新

ntp服务在该系统上可能对您没有任何意义,因此请首先将其删除。

# sudo apt-get remove ntp

现在添加命令:

ntpdate -sb time.nist.gov

/etc/rclocal

重启。那时候应该很好。


答案已更新。
斯蒂芬,

1
ntpdate不被淘汰吗?另外,如果我正确理解这一点,该服务将运行并保持本地时钟与服务器时钟的同步-这样就可以避免漂移。如果删除ntp并运行一次ntpdate,那么长时间打开计算机后,时钟会不会受到时钟漂移的影响?
ysap

史蒂芬(Stephan),请参阅问题的更新#2。
ysap

3
是的,ntpdate正在逐步淘汰。最好使用“ ntpd -q”(两个变体都要求先停止ntpd)。
tgharold 2013年

11

使用timedatectl(系统服务单元)设置时间。ntp不推荐使用。

sudo systemctl restart systemd-timesyncd.service

您可以使用以下命令查看日志更新时间 journalctl -xe | tail

参考


这适用于Ubuntu 19.04。谢谢!
krubo

10
rdate -s tick.greyware.com

如果您只想设置一次时钟,那么简单


谢谢。我目前没有系统可以检查此命令,但是如果您按照问题中的讨论和接受的答案进行操作,则会发现问题出在运行Clock update命令时实际上是网络不可用。
ysap 2015年

这解决了Raspberry Pi上的时间同步问题。谢谢。
奥利弗·斯普林

7

在Debian / Mint / Ubuntu(或其他Debian衍生产品)系统上执行此操作的正确方法是:

NTPD_OPTS="-g"

在文件中

/etc/default/ntp

这样可以确保从/etc/init.d/ntp脚本启动ntpd时,它使用“ -g”选项运行,即

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

允许ntpd在超过1000秒时校正系统时间,例如,由于没有硬件RTC,因此在系统启动时间为1970年1月1日启动时。


我已经知道了,但是仍然说纽约时间凌晨3点,应该是晚上11点。
chovy 2014年

我也已经在那条线了/etc/default/ntp,但是时间没有同步。
戴维·费伦茨·罗戈扬2014年

5

tlsdate通过与TLS安全连接到远程服务器并从安全握手中提取远程时间来设置本地时钟。不同于 ntpdatetlsdate它使用TCP(例如连接到启用了HTTPS或TLS的远程服务),并为试图提供恶意时间信息的对手提供了一定的保护。

$ tlsdate -V -n -H encrypted.google.com

5

请注意,默认情况下,当前一些基于Ubuntu的系统甚至都不使用NTP服务。在我的Linux Mint 19(Ubuntu 18.04)机器上,时间保存为systemd-timesyncd

因此,为了获得失去同步后的最新时间,我只是运行

sudo systemctl restart systemd-timesyncd

从15.04开始,Ubuntu默认使用systemd。因此,诸如time之类的关键系统是通过systemd管理的。要查找系统正在使用的服务,请运行类似

systemctl list-unit-files | grep -E 'ntp|timesyncd'

对于16.04上的TechJS,服务为ntp。对于在Ubuntu 18.04(Mint 19)上的我自己,服务是systemd-timesyncd。有趣的是,我登录了拥有的16.04服务器,并且该服务器也使用了它systemd-timesyncd


谢谢。自发布问题以来已经有很长时间了,并且我没有可用于测试的系统,但是您能否详细说明您的答案与@TechJS有何不同,尤其是您提出的命令略有不同。
ysap

哈,谢谢。这是对您的回应,也是对以后发现自己没有更多最新信息的任何人(例如我)的回应。我更新了答案,以更具体地说明如何获得答案。
亚伦·张伯伦

4

尝试使用该-b选项来增加时间。


2
从命令行尝试时,得到以下响应:1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting 。但是,我认为我以前曾尝试过此方法,rc.local但没有帮助。
ysap

3
您需要先停止ntp服务,然后才能运行ntpdate -b <ipaddress>
Wim Deblauwe 2014年

2

好,

我在树莓派上运行树莓派(debian wheezy),但没有hwclock。我发现编写一个小脚本并在Internet接口启动后运行它很方便,因此我确定在网络可用的那一刻,时钟就会更新。

首先ntpdate通过运行检查您是否拥有该软件包

sudo apt-get update
sudo apt-get install ntpdate

您需要将以下内容添加到您的/etc/network/interfaces(肯定eth0只是一个示例):

auto eth0
    iface eth0 inet dhcp
    post-up /usr/local/sbin/update-time.sh

并在中创建以下脚本/usr/local/sbin/update-time.sh(不要忘了通过使其可执行文件chmod):

#!/bin/bash
# This script checks if the ntp process is running, stops it, updates the system time, starts it again

ps cax | grep -c ntpd > /dev/null
onoff=$?
if [ "$onoff" -gt 0 ]; then
    echo "stopping ntpd..."
    service ntp stop
    echo "ntpd stopped"
else
    echo "ntpd not running, ready to update the date"
fi


isinstalled=$(dpkg-query -l | grep -c ntpdate)
if [ "$isinstalled" -gt 0 ]; then
    ntpdate -t 3 -s ntp4.stratum2.ru
    echo "date and time update executed"
else
    echo "ntpdate package not installed, can't update using ntp"
fi

echo "restarting ntpd..."
service ntp start 
echo "ntpd running"
echo "printing current date and time:"
date

exit

1

ntpd算法将丢弃超过128 ms的样本偏移,除非没有任何偏移的绝对值小于128 ms的间隔超过900s。此后的第一个样本,无论偏移量如何,都将时钟步进到指示的时间。在实践中,这将错误警报率降低,其中时钟错误地步进到几乎不发生的情况。

通常,如果偏移超过健全性限制(默认为1000 s),则ntpd退出。可以使用-g选项将其关闭:

-g通常,如果偏移量超过默认值1000 s的合理性限制,则ntpd退出。如果健全性限制设置为零,则不执行健全性检查,并且任何偏移都是可以接受的。此选项将覆盖限制,并允许将时间设置为任意值而不受限制;但是,这只能发生一次。此后,如果超出限制,ntpd将退出。该选项可与-q选项一起使用。

两者都来自http://doc.ntp.org/4.1.0/ntpd.htm

乔纳森·纳塔莱(Jonathan Natale)


1

如果您有时间等待系统同步之前花费的时间,则可以使用以下ntp-wait命令:

ntp-wait || exit -1 
# i believe this would exit the script if it fails, but not sure of ntp-wait return codes, learn this first.

echo Time is synced, go ahead with backup
tar
rsync etc.

1

如果您在systemd上,则可以使用以下命令:

sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service

然后时间在10-15秒内更新。
在Ubuntu 16.04上测试


0

ntpdntpdate默认使用受限端口(UDP 123)运行。如果您在防火墙后面,ntpd将永远无法使用,但ntpdate可以使用该-u选件。例如: ntpdate -u 0.ubuntu.pool.ntp.orgntpdate -u time.nist.gov应该都可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.