Wie erzwinge ich ein Uhr-Update mit ntp?


377

Ich verwende Ubuntu auf einem ARM-basierten Embedded-System, dem eine batteriegepufferte Echtzeituhr fehlt. Die Weckzeit liegt irgendwo im Jahr 1970. Daher verwende ich den NTP-Dienst, um die Zeit auf die aktuelle Zeit zu aktualisieren.

Ich habe der /etc/rc.localDatei die folgende Zeile hinzugefügt :

sudo ntpdate -s time.nist.gov

Nach dem Start dauert es jedoch noch einige Minuten, bis die Zeit aktualisiert ist. Während dieser Zeit kann ich nicht effektiv mit tarund arbeiten make.

Wie kann ich eine Aktualisierung der Uhr zu einem bestimmten Zeitpunkt erzwingen?


UPDATE 1: Das Folgende (danke an Eric und Stephan) funktioniert einwandfrei von der Kommandozeile aus, kann aber die Uhr beim Einfügen nicht aktualisieren /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

Was mache ich falsch?


UPDATE 2: Ich habe versucht, den wenigen Vorschlägen zu folgen, die als Reaktion auf das erste Update eingegangen sind, aber nichts scheint die Aufgabe tatsächlich wie erforderlich zu erledigen. Folgendes habe ich versucht:

  1. Tauschen Sie den Server gegen aus us.pool.ntp.org
  2. Verwenden Sie explizite Pfade zu den Programmen
  3. Entfernen Sie den ntpService insgesamt und lassen Sie nur sudo ntpdate ...inrc.local
  4. Entfernen Sie den sudoaus dem obigen Befehl inrc.local

Unter Verwendung der obigen Einstellungen startet der Computer immer noch um 1970. Wenn Sie dies jedoch über die Befehlszeile tun, nachdem Sie sich (über ssh) angemeldet haben , wird die Uhr aktualisiert, sobald ich sie aufrufe ntpdate.

Das letzte, was ich tat, war, das zu entfernen rc.localund einen Anruf ntpdatein meine .bashrcAkte zu setzen. Dadurch wird die Uhr wie erwartet aktualisiert und die aktuelle Uhrzeit wird angezeigt, sobald die Eingabeaufforderung verfügbar ist.

Dies bedeutet jedoch , dass die Zeit nie aktualisiert wird, wenn der Computer eingeschaltet ist und kein Benutzer angemeldet ist. Ich kann den ntpDienst natürlich neu installieren , damit die Uhr innerhalb weniger Minuten nach dem Start aktualisiert wird, aber dann sind wir wieder auf Platz 1.

Gibt es einen Grund, warum das Platzieren des ntpdateBefehls in rc.localnicht die erforderliche Aufgabe ausführt, während dies in .bashrceinwandfrei funktioniert?


2
von [hier] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615

4
Beachten Sie das '-b'-Flag bei ntpdate. Auf der Hilfeseite von ntpdate: "Erzwingen Sie die Zeitverschiebung mithilfe des Systemaufrufs settimeofday () und nicht mithilfe des Systemaufrufs adjtime () (Standardeinstellung). Diese Option sollte verwendet werden, wenn sie beim Start aus einer Startdatei aufgerufen wird." Viele der folgenden Antworten enthalten dies nicht, und dies ist möglicherweise Teil des Problems, Dinge zum Laufen zu bringen. Man bedenke , dass die die ‚-B‘ flag es erwähnt , dass Offsets über 128 ms Stunden dauern kann unter Verwendung des Standard ‚slew‘ -Mechanismus zu synchronisieren
Matt S.

sudoIn /etc/rc.locale müssen keine Dateien verwendet werden. Sie werden bereits als root ausgeführt.
Soren A

Antworten:


325

Wahrscheinlich wird der ntpDienst ausgeführt, daher ntpdatekann der Socket (Port 123 UDP) nicht geöffnet und keine Verbindung zum NTP-Server hergestellt werden.

Versuchen Sie es über die Befehlszeile:

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

Wenn Sie dies verwenden möchten, gehen Sie wie /etc/rc.localfolgt vor:

( /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 )&

Vielen Dank. Können Sie bitte erklären, warum Sie die expliziten Pfade benötigen?
ysap

1
Ich weiß es nicht genau. :-) Ich hatte einmal Probleme beim Versuch, servicevon rc.local und cron zu starten, aber ich konnte es mit /etc/init.d/xxx reparieren. Eigentlich glaube ich, dass Sie nicht den vollständigen Pfad ntpdateangeben müssen. Ich verwende gern vollständige Pfade in Skripten, um sicherzugehen, dass die richtige Datei gefunden wird.
Eric Carvalho

2
OK, das war anscheinend das Problem. Jetzt wird die Uhr aktualisiert, sobald die Netzwerkverbindung hergestellt ist. Vielen Dank.
ysap

3
Ich habe herausgefunden, dass das us.pool.ntp.orgreaktionsschneller ist.
Ysap

7
Mit dieser -uOption müssen Sie den NTP-Dienst nicht beenden:sudo ntpdate -u time.nist.gov
Edward Anderson

486

Verwenden Sie anstelle von ntpdate (das veraltet ist )

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

Das -gqweist den ntp-Daemon an, die Zeit unabhängig vom Offset ( g) zu korrigieren und sofort ( q) nach dem Einstellen der Zeit zu beenden .


3
Vielen Dank. Zeigt noch 1970 nach diesem Befehl (w / sudo). Wenn ntpdich die Manpage lese, bin ich mir nicht sicher, wie dies ein Update erzwingt?
ysap

12
Die Option "-q" weist den NTP-Dämon an, zu starten, die Zeit einzustellen und sofort zu beenden. Mit der Option "-g" können Zeitunterschiede von mehr als 1000 Sekunden ausgeglichen werden. Längerfristig sollten Sie den NTP-Dämon einfach so konfigurieren, dass er immer ausgeführt wird.
Tgharold

35
Diese Antwort sollte nach oben gehen, da sie korrekt ist: ntpdate ist veraltet und die Installation ist eine schlechte Idee, da sie mit ntp in Konflikt steht. Wenn die Uhr weit entfernt ist, müssen Sie diesen manuellen Schritt ausführen, da andernfalls ntp Ihre Uhr nicht ändert und Ihnen nicht sagt, warum.
Liam

31
Für mich sudo ntpd -gqnicht verlassen! Ich bin am 14.10 und ich muss STRG + C drücken, um fortzufahren ... oder wie lange soll es dauern?
Yanick Rochon

5
Zu Ihrer Information, auf meinem System (CentOS 6.6) musste ich die beiden Instanzen von sudo service ntp...auf ändern sudo service ntpd....
Rinogo

63

Verwenden Sie sntp, um die Uhrzeit sofort einzustellen. Zum Beispiel:

sudo sntp -s 24.56.178.140

Die Zahlen nach -s können ein beliebiger NTP-Zeitserver sein, der in Ft NIST ist. Collins, Colorado.


1
Das hat funktioniert! +1
CappY

7
Dies funktionierte, als "sudo ntpd -gq" dies nicht tat.
Matt White

Ich weiß nicht, wie oft ich nach dieser Antwort gesucht habe. Funktioniert jedes Mal.
Chaos

1
Kann das Paket sntp nicht finden?
Tempel

1
apt-get install sntp / yum install sntp (ja, es funktioniert auf CentOS, RedHat, Fedore auch)
ndemou

40

Wie bereits erwähnt, besteht die beste Lösung darin, ntpd anzuweisen, die Panikschwelle zu ignorieren, die standardmäßig 1000 Sekunden beträgt. Sie können den Panikschwellenwert auf zwei Arten konfigurieren:

  • Bearbeiten /etc/default/ntpund stellen Sie sicher, dass die Option -g vorhanden ist.
  • editiere /etc/ntp.conf und platziere es tinker panic 0oben

Bisher ist dies im Wesentlichen das, was andere empfohlen haben, es gibt jedoch noch einen weiteren Schritt, den Sie meiner Meinung nach unternehmen sollten. Installieren Sie das Fake-Hwclock-Programm:

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

Wenn Sie eine gefälschte Uhr installiert haben, startet Ihre Maschine nicht mehr und denkt, dass es wieder 1970 ist. Wenn Ihr Computer hochfährt, stellt er seine Uhr auf den Zeitstempel ein, den die falsche Uhr beim letzten Neustart / Herunterfahren geschrieben hat. Dies bedeutet, dass Sie eine etwas korrekte Uhr haben können, falls beim Booten Netzwerkprobleme auftreten.


1
-gschien nichts für mich zu tun (auf der Kommandozeile habe ich nicht /etc/default/ntp), sondern tinker panic 0zu ntp.confarbeiten
Dave Cousineau

@Sahuagin Ich weiß nicht, was ich dir sagen soll, außer dass du ein nicht standardmäßiges NTP-Paket hast. / etc / default / ntp ist Teil des Pakets von Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist und -g ist eine Option, solange ich mich erinnern kann.
dfc

Entschuldigung, ich schätze, ich bin eigentlich nicht auf Ubuntu und hätte ein bisschen mehr darüber nachdenken sollen, bevor ich einen Kommentar hinterlasse. tinker panic 0scheint aber definitiv geklappt zu haben.
Dave Cousineau

13

ntpdate ist ein anderes Programm als net dameon. Wahrscheinlich tritt beim Booten ein Fehler bei NTPDate auf, da ntpd auf diesem Socket ausgeführt wird.

Führen Sie von der Befehlszeile aus

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

Sie können auch ntpd alle zusammen deinstallieren (apt-get remove ntp) und ein Cron-Skript hinzufügen, um etwa jede Stunde ntpdate zu verwenden.

AKTUALISIEREN

Der ntp-Dienst wird auf diesem System wahrscheinlich keinen sinnvollen Wert für Sie haben, entfernen Sie ihn also zuerst.

# sudo apt-get remove ntp

Fügen Sie nun den Befehl hinzu:

ntpdate -sb time.nist.gov

zu /etc/rclocal

Starten Sie neu. Sollte an diesem Punkt gut sein.


Antwort aktualisiert.
Stephan

1
Wird ntpdate nicht eingestellt oder so? Wenn ich das richtig verstehe, wird der Dienst ausgeführt und die Synchronisierung der lokalen Uhr mit der Uhr des Servers wird aufrechterhalten, sodass die Abweichung gebunden ist. Wenn Sie ntp entfernen und ntpdate einmal ausführen, wird es dann nicht durch die Zeitverschiebung beeinträchtigt, wenn die Maschine längere Zeit eingeschaltet ist?
ysap

Stephan, siehe Update 2 der Frage.
ysap

3
Ja, ntpdate wird eingestellt. Die Verwendung von "ntpd -q" wird bevorzugt (beide Varianten erfordern, dass ntpd zuerst gestoppt wird).
Tgharold

11

Verwenden Sie timedatectl(systemd service unit), um die Uhrzeit einzustellen. ntpist veraltet.

sudo systemctl restart systemd-timesyncd.service

Sie können überprüfen, ob die Uhrzeit aktualisiert wurde, indem Sie die Protokolle mit lesen journalctl -xe | tail

Referenz


Dies funktionierte auf Ubuntu 19.04. Vielen Dank!
Krubo

10
rdate -s tick.greyware.com

Wenn Sie nur einmal die Uhr stellen möchten, ist dies ganz einfach


Vielen Dank. Ich habe derzeit kein System, um diesen Befehl zu überprüfen. Wenn Sie jedoch der Diskussion in der Frage und der akzeptierten Antwort folgen, werden Sie feststellen, dass das Problem zum Zeitpunkt der Ausführung des Befehls zum Aktualisieren der Uhr tatsächlich eine Netzwerkunfähigkeit war.
ysap

Dies behebt ein Zeitsynchronisationsproblem auf meinem Raspberry Pi. Danke.
Oliver Spryn

7

Der richtige Weg, dies auf einem Debian / Mint / Ubuntu-System (oder einem anderen Debian-Derivat) zu tun, besteht darin, die Leitung zu haben

NTPD_OPTS="-g"

in der Datei

/etc/default/ntp

Auf diese Weise wird sichergestellt, dass ntpd beim Start über das Skript /etc/init.d/ntp mit der Option "-g" ausgeführt wird

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

Damit kann ntpd die Systemzeit korrigieren, wenn sie mehr als 1000 s abläuft, z. B. wenn die Systemzeit beim Start am 1. Januar 1970 liegt, da keine Hardware-RTC vorhanden ist.


Ich habe das schon, aber es steht immer noch 3 Uhr morgens in NY, wenn es 23 Uhr sein sollte.
Chovy

Ich hatte auch schon genau diese Leitung /etc/default/ntp, aber die Zeit war nicht synchronisiert.
Dawid Ferenczy Rogožan

5

tlsdateStellt die lokale Uhr ein, indem eine sichere Verbindung mit TLS zu Remote-Servern hergestellt und die Remote-Zeit aus dem sicheren Handshake extrahiert wird. Im Gegensatz zu ntpdate, tlsdateverwendet TCP, zum Beispiel an einen entfernten HTTPS verbinden oder TLS aktiviert Service und bietet einen gewissen Schutz gegen Gegner , die versuchen , Ihnen Informationen böswillige Zeit zu füttern.

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

5

Beachten Sie, dass einige aktuelle Ubuntu-basierte Systeme standardmäßig nicht einmal den NTP-Dienst verwenden. Auf meinem Linux Mint 19 (Ubuntu 18.04) Rechner wird die Zeit von gehalten systemd-timesyncd.

Um eine aktuelle Zeit zu erhalten, nachdem die Synchronisation verloren gegangen ist, renne ich einfach

sudo systemctl restart systemd-timesyncd

Seit 15.04 verwendet Ubuntu standardmäßig systemd. Daher werden kritische Systeme wie die Zeit über systemd verwaltet. Um herauszufinden, welchen Dienst Ihr System verwendet, führen Sie etwa Folgendes aus

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

Für TechJS am 16.04 war der Service ntp. Für mich auf Ubuntu 18.04 (Mint 19) ist der Service systemd-timesyncd. Interessanterweise habe ich mich bei einem 16.04-Server angemeldet, der auch verwendet wird systemd-timesyncd.


Vielen Dank. Es ist lange her, die Frage zu stellen, und ich habe kein System zum Testen zur Verfügung, aber können Sie erläutern, inwiefern sich Ihre Antwort von @TechJS unterscheidet, insbesondere der von Ihnen vorgeschlagene Befehl unterscheidet sich geringfügig.
ysap

Ha danke. Es war eine Antwort an Sie, aber auch an alle, die in Zukunft keine aktuellen Informationen mehr haben (wie ich). Ich habe meine Antwort aktualisiert, um genauer zu bestimmen, wie ich zu meiner Antwort komme.
Aaron Chamberlain

4

Versuchen Sie es mit der -bOption, um die Zeit zu erhöhen.


2
Wenn von der Kommandozeile versucht, erhalte ich die folgende Antwort: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Allerdings denke ich, dass ich das schon mal probiert habe, rc.localaber es hat nicht geholfen.
ysap

3
Sie müssen den NTP-Dienst zuerst beenden, bevor Sie ausgeführt werden könnenntpdate -b <ipaddress>
Wim Deblauwe

2

Gut,

Auf meinem Himbeer-Pi läuft ein Raspbian (Debian Wheezy), der nicht über die Uhr verfügt. Ich fand es praktisch, ein kleines Skript zu schreiben und es auszuführen, nachdem meine Internetschnittstelle aktiv ist, sodass ich sicher bin, dass die Uhr aktualisiert wird, sobald das Netzwerk verfügbar ist.

Überprüfen Sie zunächst, ob Sie das ntpdatePaket haben, indem Sie ausführen

sudo apt-get update
sudo apt-get install ntpdate

Sie müssen Folgendes in Ihre hinzufügen /etc/network/interfaces( eth0hier ist sicherlich nur ein Beispiel):

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

Und erstellen Sie das folgende Skript in /usr/local/sbin/update-time.sh(vergessen Sie nicht, es ausführbar zu machen 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

Die ntpd-Algorithmen verwerfen Sample-Offsets, die 128 ms überschreiten, es sei denn, das Intervall, in dem kein [absoluter Wert von] Sample-Offset kleiner als 128 ms ist, überschreitet 900s. Das erste Sample danach, unabhängig vom Offset, stellt die Uhr auf die angegebene Zeit ein. In der Praxis reduziert dies die Fehlalarmrate, wenn die Uhr fehlerhaft verschoben wird, auf ein verschwindend geringes Vorkommen.

Normalerweise wird ntpd beendet, wenn der Versatz die Vernunftsgrenze überschreitet, die standardmäßig 1000 s beträgt. Dies kann mit der Option -g ausgeschaltet werden:

-g Normalerweise wird ntpd beendet, wenn der Offset die Vernunftsgrenze überschreitet, die standardmäßig 1000 s beträgt. Wenn die Vernunftsgrenze auf Null gesetzt ist, wird keine Vernunftsprüfung durchgeführt und ein Offset ist akzeptabel. Diese Option setzt das Limit außer Kraft und ermöglicht es, die Zeit ohne Einschränkung auf einen beliebigen Wert zu setzen. Dies kann jedoch nur einmal vorkommen. Danach wird ntpd beendet, wenn das Limit überschritten wird. Diese Option kann mit der Option -q verwendet werden.

beide von http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale


1

Wenn Sie sich die Zeit leisten können, zu warten, bis Ihr System synchronisiert ist, können Sie den folgenden ntp-waitBefehl verwenden:

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

Wenn Sie auf systemd sind, können Sie diesen Befehl verwenden:

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

Und dann wird die Zeit innerhalb von 10-15 Sekunden aktualisiert.
Getestet auf Ubuntu Mate 16.04


0

ntpdund ntpdatestandardmäßig über einen eingeschränkten Port (UDP 123) ausgeführt. Wenn Sie sich hinter einer Firewall befinden, ntpdwird das nie funktionieren, ntpdatekann aber mit der -uOption funktionieren . Zum Beispiel: ntpdate -u 0.ubuntu.pool.ntp.org oder ntpdate -u time.nist.govsollten beide gut funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.