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

我将以下行添加到/etc/rc.local文件:

sudo ntpdate -s time.nist.gov


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

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


UPDATE 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:我尝试遵循为响应这些建议而提出的一些建议第一次更新,但似乎没有实际执行所需的工作。这是我尝试的方法:


将服务器替换为us.pool.ntp.org

使用程序的显式路径
完全删除ntp服务,仅将sudo ntpdate ...留在rc.local

使用以上命令从sudo中的上述命令中删除rc.local


使用上述方法,机器仍在1970年启动。但是,从命令行一次执行登录(通过ssh)后,一旦调用ntpdate,时钟就会更新。这确实会按预期更新时钟,并且在命令提示符可用时我会获得真实的当前时间。

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

因此,是否有理由为什么在ntpdate中放置.bashrc命令不会执行所需的任务,而在ntp中这样做却可以正常工作?

评论

来自[这里] [1]:ntpdate -s ntp.ubuntu.com [1]:askubuntu.com/a/81301/130162

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

无需在/etc/rc.local文件中使用sudo ..它们已经以root身份运行。

timedatectl,但askubuntu.com/questions/832646/…

#1 楼

ntp服务可能正在运行,这就是为什么ntpdate无法打开套接字(端口123 UDP)并连接到ntp服务器的原因。
从命令行尝试: br />
如果要将其放在/etc/rc.local中,请使用以下内容:

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


评论


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

–ysap
13年2月14日在21:06

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

–埃里克·卡瓦略(Eric Carvalho)
13年2月14日在21:43



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

–ysap
13年2月16日在1:23

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

–ysap
13年2月16日在1:25

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

–爱德华·安德森(Edward Anderson)
17年3月3日在14:09

#2 楼

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

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


-gq告诉ntp守护程序改正时间而不考虑偏移量(g)并立即退出(设置时间后q)。

评论


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

–ysap
13年2月14日在18:42

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

– tgharold
2013年9月9日18:16

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

–利亚姆
2014年2月6日在21:11

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

– Yanick Rochon
2015年1月27日在2:41



仅供参考,在我的系统(CentOS 6.6)上,我需要将sudo服务ntp ...的两个实例更改为sudo服务ntpd...。

– rinogo
15年1月27日在22:48

#3 楼

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

sudo sntp -s 24.56.178.140

评论


当“ sudo ntpd -gq”不起作用时,此方法起作用。

–马特·怀特
16年4月29日在14:54

无法找到软件包sntp?

–寺庙
17年4月5日在17:54

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

– ndemou
17年5月5日在7:40

可以在ntppool.org上找到服务器的便捷列表。

–Skippy le Grand Gourou
19 Mar 7 '19 at 6:57



如果要立即调整而不是逐步调整,请先准备好其他时钟的准确时间:sudo date MMDDhhmm

–兰德尔·惠特曼
19年9月12日在22:00

#4 楼

正如其他人指出的,最佳解决方案是指示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.


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

评论


-g似乎对我什么都不做(在命令行中,我没有/ etc / default / ntp),但是在ntp.conf中添加了Tinker panic 0

–戴夫·库西诺(Dave Cousineau)
17年8月10日在1:36

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

– dfc
17年8月10日在1:52

抱歉,我想我实际上不在Ubuntu上,在发表评论之前应该多想一点。修补匠恐慌0似乎确实起作用了。

–戴夫·库西诺(Dave Cousineau)
17年8月10日在20:21

#5 楼

使用timedatectl(系统服务单元)设置时间。 ntp已过时。

sudo systemctl restart systemd-timesyncd.service


您可以使用journalctl -xe | tail读取日志来检查更新时间

参考


Ubuntu服务器文档
Freedesktop
man timesyncd.conf


评论


这适用于Ubuntu 19.04。谢谢!

–krubo
19年7月8日在19:59

ntp未在Ubuntu 18.04及更高版本上安装,因此不应安装

– Victor Lamoine
19年11月22日在8:40

其他答案非常不推荐使用,并且大多无效。该答案应该是新的公认答案,因为它是最新的且效果最好的。剩下的唯一需要另一个答案的是使用无系统OS的用户。

–明仁
20-2-17的16:00

最佳答案!其他已经过时

– Volvox
20-4-5的16:05

#6 楼

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

从命令行运行

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


也可以卸载ntpd全部在一起(apt-get删除ntp)并添加一个cron脚本以每小时大约使用ntpdate。

UPDATE

ntp服务可能对您在此系统上,因此请先将其删除。

# sudo apt-get remove ntp


现在添加命令:

ntpdate -sb time.nist.gov


/etc/rclocal

重新启动。那时应该很好。

评论


答案已更新。

–史蒂芬(Stephan)
13年2月14日在19:53

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

–ysap
13年2月14日在21:07



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

–ysap
13年2月15日在21:42

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

– tgharold
2013年9月9日18:17

#7 楼

rdate -s tick.greyware.com


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

评论


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

–ysap
15年2月27日,0:57

这解决了Raspberry Pi上的时间同步问题。谢谢。

–奥利弗·斯普林(Oliver Spryn)
17年2月15日在16:58

#8 楼

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

NTPD_OPTS="-g"



/etc/default/ntp


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

运行
 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点。

–碎肉
2014年7月6日在3:07

我在/ etc / default / ntp中也已经有该行,但是时间没有同步。

– David FerenczyRogožan
2014年11月10日18:15

#9 楼

请注意,当前默认情况下,某些当前基于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
18年11月29日在17:37

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

–亚伦·张伯伦
18年11月29日在18:52

#10 楼

tlsdate通过与TLS安全地连接到远程服务器并从安全握手中提取远程时间来设置本地时钟。与
ntpdate不同,tlsdate使用TCP(例如,连接到启用了HTTPS或TLS的远程服务),并提供了一些防御措施,以防止试图向您提供恶意时间信息的对手。

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


#11 楼

尝试使用-b选项逐步计时。

评论


从命令行尝试时,得到以下响应:1 Jan 00:04:11 ntpdate [2226]:NTP套接字正在使用中,正在退出。但是,我认为我之前曾在rc.local中尝试过此方法,但没有帮助。

–ysap
13年2月13日在22:28



您需要先停止ntp服务,然后才能运行ntpdate -b

– Wim Deblauwe
2014年11月26日13:02

#12 楼

看看这个(不提供服务,不提供服务):

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"


为Prashant喝彩,他们解决了这个问题

评论


感谢并欢迎您来到SE。看来这是您的第一笔捐款。我目前无法测试您的答案,但请添加参考以及可能的解释。另外,请务必阅读本网站的参与规则。

–ysap
20-5-6在9:13



#13 楼

好吧,

我在树莓派上运行的是树莓派(debian wheezy),它没有时钟。我发现编写一个小脚本并在我的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


#14 楼

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

#15 楼

如果您有时间等待系统同步之前花费的时间,则可以使用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.


#16 楼

如果您使用的是systemd,则可以使用以下命令:

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


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

#17 楼

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

#18 楼

除了建议停止本地时间服务器(ntpd或timesyncd)外,然后建议ntpdate -bs serverntpd -gq,然后再次启动时间服务器以保持建议的时间同步(这些步骤可以在@reboot cron作业脚本中;请参阅man 5 crontab (有关详细信息),可能需要调整时区以使时间命令报告所需的时间/日期。

对于Ubuntu等,请使用:dpkg-reconfigure tzdata并选择正确的语言环境。它在重新启动之间保持其值。