465

I am running Ubuntu on an ARM based embedded system that lacks a battery backed RTC. The wake-up time is somewhere during 1970. Thus, I use the NTP service to update the time to the current time.

I added the following line to /etc/rc.local file:

sudo ntpdate -s time.nist.gov

However, after startup, it still takes a couple of minutes until the time is updated, during which period I cannot work effectively with tar and make.

How can I force a clock update at any given time?


UPDATE 1: The following (thanks to Eric and Stephan) works fine from command line, but fails to update the clock when put in /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

What am I doing wrong?


UPDATE 2: I tried following the few suggestions that came in response to the 1st update, but nothing seems to actually do the job as required. Here's what I tried:

  1. Replace the server to us.pool.ntp.org
  2. Use explicit paths to the programs
  3. Remove the ntp service altogether and leave just sudo ntpdate ... in rc.local
  4. Remove the sudo from the above command in rc.local

Using the above, the machine still starts at 1970. However, when doing this from command line once logged in (via ssh), the clock gets updated as soon as I invoke ntpdate.

Last thing I did was to remove that from rc.local and place a call to ntpdate in my .bashrc file. This does update the clock as expected, and I get the true current time once the command prompt is available.

However, this means that if the machine is turned on and no user is logged in, then the time never gets updates. I can, of course, reinstall the ntp service so at least the clock is updated within a few minutes from startup, but then we're back at square 1.

So, is there a reason why placing the ntpdate command in rc.local does not perform the required task, while doing so in .bashrc works fine?

ysap
  • 6,981
  • 5
    from here: ntpdate -s ntp.ubuntu.com – 18446744073709551615 May 28 '15 at 07:27
  • 5
    notice the '-b' flag on ntpdate. From ntpdate's man page: "Force the time to be stepped using the settimeofday() system call, rather than slewed (default) using the adjtime() system call. This option should be used when called from a startup file at boot time." Many of the answers below do not include it, and that maybe part of the problem in getting things to work. Consider that the the '-B' flag it mentions that offsets over 128 ms can take hours to sync using the default 'slew' mechanism – Matt S. Jun 22 '15 at 06:39
  • There are no need to use sudo in /etc/rc.locale files .. they are allready run as root. – Soren A Jun 01 '17 at 12:12
  • 1
    timedatectl, but https://askubuntu.com/questions/832646/how-to-update-system-time-behind-a-proxy – Brent Bradburn Apr 15 '19 at 22:03

18 Answers18

611

Instead of ntpdate (which is deprecated), use ntpd:

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

The -gq tells the ntp daemon to correct the time regardless of the offset (g) and exit immediately (q) after setting the time.

αғsнιη
  • 35,660
  • 3
    Thanks. Still showing 1970 after this command (w/ sudo). Reading ntpd manpage, I am not sure how this forces an update? – ysap Feb 14 '13 at 18:42
  • 12
    The "-q" option tells the NTP daemon to start up, set the time and immediately exit. The "-g" option allows it to correct for time differences larger then 1000 sec. For longer term, you should simply configure the NTP daemon to be running always. – tgharold Sep 09 '13 at 18:16
  • 42
    This answer should go to the top, because it is correct: ntpdate is deprecated and installing it is a bad idea, because it conflicts with ntp. If the clock is way off, you need to do this manual step because otherwise ntp will not change your clock and will not tell you why. – Liam Feb 06 '14 at 21:11
  • 1
    I'm on ubuntu 12 and ntpd is not installed. Saying ntpdate is deprecated so you should use ntpd instead kinda implies that it's installed by default. – jcollum Apr 25 '14 at 02:27
  • 38
    For me, sudo ntpd -gq does not exit! I'm on 14.10 and I have to CTRL+C to continue... or how long is it supposed to take? – Yanick Rochon Jan 27 '15 at 02:41
  • 6
    FYI, on my system (CentOS 6.6), I needed to change the two instances of sudo service ntp... to sudo service ntpd.... – rinogo Jan 27 '15 at 22:48
  • 2
    Same as @YanickRochon for me; it's been like 3 minutes and I just keep getting "Soliciting pool server" messages – jcollum Aug 06 '17 at 19:39
  • Is it really necessary to stop the NTP service before the manual sync? I skipped that and ran just sudo ntpd -gq. It seems to have synced the time successfully. – Melebius Sep 07 '17 at 07:37
  • 2
    for a note - if service not exist - run sudo apt-get install ntp :-) – Bruno Jan 20 '18 at 22:58
  • 1
    You have to stop it before ntpd -gq otherwise it complains about unable to bind to port.... – slm Jul 31 '18 at 01:26
  • @slm: sudo service ntp stop does that. – Martin Schröder Jul 31 '18 at 05:22
  • 1
    @MartinSchröder - I know that, I was replying to melebius' comment. – slm Jul 31 '18 at 05:58
  • @ysap this should be the accepted answer. – gawbul Aug 12 '19 at 10:07
  • 3
    unfortunately ntpdates deprecation was announced before there was a functioning replacement https://support.ntp.org/bin/view/Dev/DeprecatingNtpdate and ntpd -gq fails on many systems. – user1133275 Dec 04 '19 at 20:40
  • is it necessary to use the -q option to be able to re-enable ntpd as a service? – charliesneath Sep 03 '20 at 01:13
  • Keep stalling nothing happened, while ntpdate worked just fine. – Ben Jul 05 '21 at 14:57
  • @MartinSchröder, please add instructions for "openntpd", too: sudo service openntpd stop sudo ntpd -s sudo service openntpd start – famzah Dec 03 '21 at 21:21
  • 1
    Issuing ntpd -gq gives me unable to bind to wildcard address :: - another process may be running - EXITING. It explains why the ntp service does nothing, although it's a mystery what blocks it exactly. – Gergely Lukacsy Feb 07 '23 at 12:45
  • It is correct that the ntpdate binary is deprecated. The ntpdate command, however, is not. When the binary goes away, it will be replaced by an "ntpdate" shell script. The command, therefore, is going nowhere. The currently accepted answer is rightfully so. See -q option under https://man.netbsd.org/ntpd.8 – Kurt Fitzner Nov 13 '23 at 16:07
369

Probably the ntp service is running, that's why ntpdate can't open the socket (port 123 UDP) and connect to ntp server.

Try from command line:

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

If you want to put this in /etc/rc.local use the following:

( /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 )&
Eric Carvalho
  • 54,385
  • Thanks. Can you please explain why you need the explicit paths? – ysap Feb 14 '13 at 21:06
  • 2
    I don't really know. :-) I had trouble once trying to run service from rc.local and cron but I managed to fix it using /etc/init.d/xxx instead. Actually I think you don't have to give the full path to ntpdate, I like to use full paths in scripts just to be sure the right file wiill be found. – Eric Carvalho Feb 14 '13 at 21:43
  • I tried changing rc.local accordingly, but then the clock won't update at all, even not from command line. – ysap Feb 14 '13 at 22:54
  • Eric, please see update #2 to the question. – ysap Feb 15 '13 at 21:42
  • I guess the network is still down when rc.local runs. I added a loop to test Internet reachability and if so proceed with ntpdate. Check my answer. – Eric Carvalho Feb 15 '13 at 23:18
  • mmm... that definitely makes sense. I will try. – ysap Feb 16 '13 at 00:19
  • 2
    OK, this was apparently the problem. Now the clock is being updated as soon as the network connection is established. Thanks. – ysap Feb 16 '13 at 01:23
  • 4
    I did found out that the us.pool.ntp.org is more responsive. – ysap Feb 16 '13 at 01:25
  • @pguardiario - this is definitely a very constructive and educating comment... – ysap Oct 14 '16 at 06:05
  • As noted below, ntp is deprecated – datakid Feb 28 '17 at 02:24
  • 10
    With the -u option, you don't need to stop the ntp service: sudo ntpdate -u time.nist.gov – Edward Anderson Mar 03 '17 at 14:09
  • On my system, the full paths to the scripts in init.d end in d, e.g. /etc/init.d/ntpd start etc. – Mark Lakata Jun 23 '17 at 22:40
  • I had the same problem and worked through all the different solutions - none worked for me; TLDR was that I was on an EC2 instance and needed to let Xen know I wanted to run my own clock: sudo bash -c 'echo 1 > /proc/sys/xen/independent_wallclock' and sudo bash -c 'echo xen.independent_wallclock=1 >> /etc/sysctl.conf' - then both ntpdate and ntpd -gq options worked – jaygooby Feb 22 '18 at 10:56
  • 1
    ntp is deprecated in newer versions. Instead use systemd-timesyncd.service. – subtleseeker Aug 18 '19 at 11:46
  • It gives following error: Failed to start ntp.service: Unit ntp.service is masked. – alper Sep 27 '21 at 16:32
82

Use timedatectl (systemd service unit) to set the time. ntp is deprecated.

sudo systemctl restart systemd-timesyncd.service

You can check the time was updated reading the logs with journalctl -xe | tail.

Status with timedatectl status and config in /etc/systemd/timesyncd.conf.

Reference

Pablo Bianchi
  • 15,657
  • 2
    This worked on Ubuntu 19.04. Thanks! – krubo Jul 08 '19 at 19:59
  • 4
    ntp is not installed on Ubuntu 18.04 and beyond and it should not be installed – Victor Lamoine Nov 22 '19 at 08:40
  • 13
    The other answers are very deprecated and mostly non-working. This answer should be the new accepted answer, as it is the most recent and best working. The only ones left needing another answer is users with a systemd-less OS. – Akito Feb 17 '20 at 16:00
  • 5
    Best answer! Others are out of date – Volvox Apr 05 '20 at 16:05
  • 1
    Works well for Ubuntu 20.04. Thanks! – Jea Jul 23 '21 at 13:05
  • Should we do timedatectl set-timezone UTC befor starting the systemd-timesyncd.service – alper Sep 27 '21 at 16:54
  • Works in Ubuntu 22.10. May want to set the timezone first with something like timedatectl set-timezone 'America/Chicago' though. (Use a command like timedatectl list-timezones | grep America to get the list of timezones.) – Patrick Dark Nov 11 '22 at 11:36
72

Use sntp to set the time immediately. Some examples from its man page:

USAGE
     sntp ntpserver.somewhere
             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.
 sntp -Ss -M 128 ntpserver.somewhere
         With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is
         synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will
         be stepped.

 sntp -S ntpserver.somewhere
         With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐
         recated) ntpdate(8), or rdate(8) commands.

It does work with any ntp time server. A convenient list of servers can be found on ntppool.org.

You need sudo privileges, for example:

sudo sntp -Ss -M 128 0.de.pool.ntp.org
yucer
  • 208
Guest
  • 721
42

As others have pointed out the best solution is to instruct ntpd to ignore the panic threshold, which is 1000 seconds by default. You can configure the panic threshold in one of two ways:

  • edit /etc/default/ntp and ensure that the -g option is present.
  • edit /etc/ntp.conf and place tinker panic 0 at the top

So far this is essentially what others have recommended however there is one more step I think you should take. Install the fake-hwclock program:

# 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.

With fake-hwclock installed your machine will not start up thinking it is 1970 all over again. When your machine boots up it will set its clock to the timestamp fake-hwclock wrote during the last reboot/shutdown. This means you can have a somewhat correct clock in case there are network issues when you boot up.

dfc
  • 1,567
  • 1
    -g seemed to do nothing for me (at the command line, I don't have /etc/default/ntp), but adding tinker panic 0 to ntp.conf worked – Dave Cousineau Aug 10 '17 at 01:36
  • @Sahuagin I don't know what to tell you other than you have a nonstandard ntp package. /etc/default/ntp is part of the package from Ubuntu: https://packages.ubuntu.com/xenial/amd64/ntp/filelist and -g has been an option for as long as I can remember. – dfc Aug 10 '17 at 01:52
  • sorry, I guess I'm not actually on Ubuntu and should have thought a little more before commenting. tinker panic 0 definitely seems to have worked though. – Dave Cousineau Aug 10 '17 at 20:21
13

ntpdate is a program different from the net dameon. NTPDate is probably erroring out on boot because ntpd is running on that socket.

From the command line, run

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

You could also uninstall ntpd all together (apt-get remove ntp) and add a cron script to use ntpdate every hour or so.

UPDATE

ntp service probably won't have meaningful value for you on this system, so remove that first.

# sudo apt-get remove ntp

Now add the command:

ntpdate -sb time.nist.gov

to /etc/rclocal

Reboot. Should be good at that point.

Stephan
  • 580
  • answer updated. – Stephan Feb 14 '13 at 19:53
  • 1
    Isn't ntpdate being phased out or something? Also, If I understand this correctly, the service runs and maintains the sync of the local clock to the server's clock - so the drift is bound. If you remove ntp and run ntpdate once, won't it be affected by clock drifting when the machine is on for extended periods? – ysap Feb 14 '13 at 21:07
  • Stephan, please see update #2 to the question. – ysap Feb 15 '13 at 21:42
  • 3
    Yes, ntpdate is being phased out. Use of "ntpd -q" is preferred (both variants require that ntpd be stopped first). – tgharold Sep 09 '13 at 18:17
11
rdate -s tick.greyware.com

if all you want to do is set the clock once, simple

batflaps
  • 211
  • Thanks. I don't currently have the system to check this command, but if you follow the discussion in the question and the accepted answer, you'll see that the problem was actually network unavailability at the time of running the clock update command. – ysap Feb 27 '15 at 00:57
  • This fixed a time sync issue on my Raspberry Pi. Thank you. – Oliver Spryn Feb 15 '17 at 16:58
9

Note that some current Ubuntu based systems don't even use the NTP service by default now. On my Linux Mint 19 (Ubuntu 18.04) machine, time is kept by systemd-timesyncd.

So to get an up to date time after it has lost sync, I just run

sudo systemctl restart systemd-timesyncd

Since 15.04 Ubuntu uses systemd by default. Therefore critical systems like time are managed through systemd. To find what service your system is using run something like

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

For TechJS on 16.04 the service was ntp. For myself on Ubuntu 18.04 (Mint 19) the service is systemd-timesyncd. Interestingly, I logged into a 16.04 server I have and it uses systemd-timesyncd as well.

  • Thanks. It has been a long time since posting the question, and I don't have a system available for testing, but can you elaborate on how is your answer different from @TechJS , especially the command you proposed is slightly different. – ysap Nov 29 '18 at 17:37
  • Ha thanks. It was a response to you but also to anyone who in the future finds themselves here without more up to date information (like myself). I updated my answer to be more specific on how I reach my answer. – Aaron Chamberlain Nov 29 '18 at 18:52
  • Thanks. That helps. systemd-timesyncd was disabled on my system. – kot-da-vinci Mar 31 '21 at 11:13
8

Check out this one (no apt, no service):

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

Cheers to Prashant, who solved that issue

Joachim
  • 81
  • 1
    Thanks and welcome to SE. Looks like this is your 1st contribution. I cannot test your answer at this point, but please add a reference and an possibly, an explanation. Also make sure to read the rules of participation in this site. – ysap May 06 '20 at 09:13
  • 1
    Thanks for this neat trick, it has helped me in an environment where none of the others did (apparently there are some weird FW settings there or something). – CoolKoon Jul 25 '22 at 12:36
  • 1
    Saved my life, cuz apt refused to install ntp; E: Release file for http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease is not valid yet (invalid for another 56min 11s) because of the clock being wrong... – masterxilo Sep 10 '22 at 13:08
  • thanks for this, I only wanted to update once and not install anything. – cloudxix Mar 02 '24 at 06:17
8

The correct way to do this on a Debian / Mint / Ubuntu (or other Debian derivative) system is to have the line

NTPD_OPTS="-g"

in the file

/etc/default/ntp

This ensures that when ntpd is started from the /etc/init.d/ntp script, it runs with the "-g" option, 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

to allow ntpd to correct the system time when it is more than 1000 s out, eg when the system time is January 1st 1970 on startup because there is no hardware RTC.

J G Miller
  • 556
  • 4
  • 7
7

tlsdate sets the local clock by securely connecting with TLS to remote servers and extracting the remote time out of the secure handshake. Unlike ntpdate, tlsdate uses TCP, for instance connecting to a remote HTTPS or TLS enabled service, and provides some protection against adversaries that try to feed you malicious time information.

$ tlsdate -V -n -H encrypted.google.com
slm
  • 3,035
Kokizzu
  • 499
3

Try using the -b option to step the time.

Cry Havok
  • 1,322
  • 2
    When trying from command line, I get the following response: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting. However, I think that I tried this before in rc.local but it did not help. – ysap Feb 13 '13 at 22:28
  • 3
    You need to stop the ntp service first before you can run ntpdate -b <ipaddress> – Wim Deblauwe Nov 26 '14 at 13:02
2

Well,

I am running a raspbian (debian wheezy) on my raspberry pi, which doesn't have the hwclock. I found it handy to write a little script and run it after my internet interface is up, so that I am sure that the moment the network becomes available, the clock gets updated.

First check that you have the ntpdate package by running

sudo apt-get update
sudo apt-get install ntpdate

You need to add the following into your /etc/network/interfaces (surely eth0 here is just an example):

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

And create the following script in /usr/local/sbin/update-time.sh (don't forget to make it executable by 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

If you are on systemd you could use this command:

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

And then the time gets updated within near 10-15 seconds.
Tested on ubuntu mate 16.04

1

The ntpd algorithms discard sample offsets exceeding 128 ms, unless the interval during which no [absolute value of] sample offset is less than 128 ms exceeds 900s. The first sample after that, no matter what the offset, steps the clock to the indicated time. In practice this reduces the false alarm rate where the clock is stepped in error to a vanishingly low incidence.

Normally, ntpd exits if the offset exceeds the sanity limit, which is 1000 s by default. This can be turned off with the -g option:

-g Normally, ntpd exits if the offset exceeds the sanity limit, which is 1000 s by default. If the sanity limit is set to zero, no sanity checking is performed and any offset is acceptable. This option overrides the limit and allows the time to be set to any value without restriction; however, this can happen only once. After that, ntpd will exit if the limit is exceeded. This option can be used with the -q option.

both from http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Elder Geek
  • 36,023
  • 25
  • 98
  • 183
Jonathzen
  • 11
  • 1
1

ntpd and ntpdate run by default using a restricted port (UDP 123). If you are behind a firewall, ntpd will never work, but ntpdate can work with the -u option. For example: ntpdate -u 0.ubuntu.pool.ntp.org or ntpdate -u time.nist.gov should both work fine.

Ron
  • 20,638
1

If you can afford the time to wait whatever time it takes before your system gets in sync, you can use the ntp-wait command:

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.
muru
  • 197,895
  • 55
  • 485
  • 740
0

Besides recommending to stop the local time server (ntpd or timesyncd), then ntpdate -bs server or ntpd -gq, and after that starting again the time server to keep the time synchronized as many suggested (these steps could be in an @reboot cron job script; see man 5 crontab for details), could be necessary to adjust the Time Zone for the time commands to report the desired time/date.

For Ubuntu and the like use: dpkg-reconfigure tzdata and select the right locale. It keeps its value between restarts.

Fjor
  • 300