Bagaimana cara memaksa pembaruan jam menggunakan ntp?

377

Saya menjalankan Ubuntu pada sistem embedded berbasis ARM yang tidak memiliki RTC yang didukung baterai. Waktu bangun ada di suatu tempat selama tahun 1970. Jadi, saya menggunakan layanan NTP untuk memperbarui waktu ke waktu saat ini.

Saya menambahkan baris berikut ke /etc/rc.localfile:

sudo ntpdate -s time.nist.gov

Namun, setelah startup, masih perlu beberapa menit sampai waktu diperbarui, selama periode itu saya tidak dapat bekerja secara efektif dengan tardan make.

Bagaimana saya bisa memaksa pembaruan jam pada waktu tertentu?


UPDATE 1: Berikut ini (terima kasih kepada Eric dan Stephan) berfungsi dengan baik dari baris perintah, tetapi gagal memperbarui jam ketika dimasukkan ke dalam /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

Apa yang saya lakukan salah?


UPDATE 2: Saya mencoba mengikuti beberapa saran yang datang sebagai tanggapan terhadap pembaruan 1, tetapi tampaknya tidak ada yang benar-benar melakukan pekerjaan seperti yang diperlukan. Inilah yang saya coba:

  1. Ganti server ke us.pool.ntp.org
  2. Gunakan jalur eksplisit ke program
  3. Lepaskan ntplayanan sama sekali dan meninggalkan hanya sudo ntpdate ...dirc.local
  4. Hapus sudodari perintah di atas dirc.local

Menggunakan di atas, mesin masih mulai pada tahun 1970. Namun, ketika melakukan ini dari baris perintah setelah login (via ssh), jam akan diperbarui segera setelah saya memohon ntpdate.

Hal terakhir yang saya lakukan adalah menghapus itu dari rc.localdan melakukan panggilan ke ntpdatedalam .bashrcfile saya . Ini memperbarui jam seperti yang diharapkan, dan saya mendapatkan waktu saat ini yang sebenarnya setelah prompt perintah tersedia.

Namun , ini berarti bahwa jika mesin dihidupkan dan tidak ada pengguna yang login, maka waktu tidak akan pernah mendapat pembaruan. Saya dapat, tentu saja, menginstal ulang ntplayanan sehingga setidaknya jam diperbarui dalam beberapa menit dari startup, tapi kemudian kita kembali ke kotak 1.

Jadi, apakah ada alasan mengapa menempatkan ntpdateperintah di rc.localtidak melakukan tugas yang diperlukan, sementara melakukannya dengan .bashrcbaik?

ya
sumber
2
dari [di sini] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615
4
perhatikan tanda '-b' pada ntpdate. Dari halaman manual ntpdate: "Paksa waktu untuk melangkah menggunakan settimeofday () system call, daripada slewed (default) menggunakan adjtime () system call. Opsi ini harus digunakan ketika dipanggil dari file startup saat boot." Banyak jawaban di bawah ini tidak memasukkannya, dan itu mungkin merupakan bagian dari masalah dalam membuat sesuatu bekerja. Pertimbangkan bahwa tanda '-B' menyebutkan bahwa penyeimbangan lebih dari 128 ms dapat memakan waktu berjam-jam untuk disinkronkan menggunakan mekanisme 'bilah' default
Matt S.
Tidak perlu menggunakan sudofile /etc/rc.locale .. semuanya sudah dijalankan sebagai root.
Soren A
timedatectl, tetapi askubuntu.com/questions/832646/…
nobar

Jawaban:

325

Mungkin ntplayanan berjalan, itu sebabnya ntpdatetidak dapat membuka soket (port 123 UDP) dan terhubung ke server ntp.

Coba dari baris perintah:

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

Jika Anda ingin /etc/rc.localmenggunakan ini sebagai berikut:

( /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
sumber
Terima kasih. Bisakah Anda jelaskan mengapa Anda membutuhkan jalur eksplisit?
ysap
1
Saya tidak begitu tahu. :-) Saya pernah mengalami kesulitan mencoba menjalankan servicedari rc.local dan cron tapi saya berhasil memperbaikinya menggunakan /etc/init.d/xxx sebagai gantinya. Sebenarnya saya pikir Anda tidak harus memberikan path lengkap ke ntpdate, saya suka menggunakan path lengkap dalam skrip hanya untuk memastikan file yang tepat akan ditemukan.
Eric Carvalho
2
Oke, ini rupanya masalahnya. Sekarang jam sedang diperbarui segera setelah koneksi jaringan dibuat. Terima kasih.
ysap
3
Saya menemukan bahwa us.pool.ntp.orgitu lebih responsif.
ysap
7
Dengan -uopsi ini, Anda tidak perlu menghentikan layanan ntp:sudo ntpdate -u time.nist.gov
Edward Anderson
486

Alih-alih ntpdate (yang sudah usang ), gunakan

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

Perintah -gqmemberitahu ntp daemon untuk memperbaiki waktu terlepas dari offset ( g) dan keluar segera ( q) setelah mengatur waktu.

Martin Schröder
sumber
3
Terima kasih. Masih menampilkan tahun 1970 setelah perintah ini (w / sudo). Membaca ntpdmanual, saya tidak yakin bagaimana ini memaksa pembaruan?
ysap
12
Opsi "-q" memberi tahu NTP daemon untuk memulai, mengatur waktu dan segera keluar. Opsi "-g" memungkinkannya untuk mengoreksi perbedaan waktu yang lebih besar dari 1000 detik. Untuk jangka panjang, Anda cukup mengkonfigurasi daemon NTP agar selalu berjalan.
tgharold
35
Jawaban ini harus menuju ke atas, karena itu benar: ntpdate sudah usang dan menginstalnya adalah ide yang buruk, karena bertentangan dengan ntp. Jika jamnya mati, Anda perlu melakukan langkah manual ini karena jika tidak ntp tidak akan mengubah jam Anda dan tidak akan memberi tahu Anda alasannya.
Liam
31
Bagi saya, sudo ntpd -gqjangan keluar! Saya pada 14.10 dan saya harus CTRL + C untuk melanjutkan ... atau berapa lama waktu yang dibutuhkan?
Yanick Rochon
5
FYI, pada sistem saya (CentOS 6.6), saya perlu mengubah dua instance sudo service ntp...menjadi sudo service ntpd....
rinogo
63

Gunakan sntp untuk mengatur waktu dengan segera. Sebagai contoh:

sudo sntp -s 24.56.178.140

Angka-angka setelah -s dapat berupa server waktu ntp, yang mana adalah NIST di Ft. Collins, Colorado.

Tamu
sumber
1
Itu berhasil! +1
CappY
7
Ini bekerja ketika "sudo ntpd -gq" tidak.
Matt White
Saya tidak tahu berapa kali saya datang mencari jawaban ini. Bekerja setiap saat.
Kekacauan
1
tidak dapat menemukan paket sntp?
temple
1
apt-get install sntp / yum install sntp (ya itu bekerja pada CentOS, RedHat, fedore juga)
ndemou
40

Seperti orang lain telah menunjukkan solusi terbaik adalah dengan menginstruksikan ntpd untuk mengabaikan ambang panik, yang secara default adalah 1000 detik. Anda dapat mengonfigurasi ambang panik dengan salah satu dari dua cara:

  • edit /etc/default/ntpdan pastikan opsi -g ada.
  • edit /etc/ntp.conf dan letakkan tinker panic 0di atas

Sejauh ini pada dasarnya apa yang direkomendasikan orang lain namun ada satu langkah lagi yang saya pikir harus Anda ambil. Instal program jam palsu:

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

Dengan jam palsu dipasangi mesin Anda tidak akan mulai berpikir itu tahun 1970 lagi. Ketika mesin Anda melakukan booting, ia akan menyetel jamnya ke stempel waktu palsu-hwclock yang ditulis selama reboot / shutdown terakhir. Ini berarti Anda dapat memiliki jam yang agak tepat jika ada masalah jaringan saat Anda boot.

dfc
sumber
1
-gtampaknya tidak melakukan apa pun untuk saya (di baris perintah, saya tidak punya /etc/default/ntp), tetapi menambahkan tinker panic 0untuk ntp.confbekerja
Dave Cousineau
@ Sahuagin Saya tidak tahu harus berkata apa selain Anda memiliki paket ntp yang tidak standar. / etc / default / ntp adalah bagian dari paket dari Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist dan -g telah menjadi pilihan selama yang saya ingat.
dfc
maaf, saya kira saya tidak benar-benar di Ubuntu dan seharusnya berpikir sedikit sebelum berkomentar. tinker panic 0pasti tampaknya telah bekerja.
Dave Cousineau
13

ntpdate adalah program yang berbeda dari net dameon. NTPDate mungkin error saat boot karena ntpd berjalan pada socket itu.

Dari baris perintah, jalankan

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

Anda juga dapat menghapus instalan ntpd secara bersamaan (apt-get remove ntp) dan menambahkan skrip cron untuk menggunakan ntpdate setiap jam atau lebih.

MEMPERBARUI

Layanan ntp mungkin tidak akan memiliki nilai yang berarti bagi Anda di sistem ini, jadi hapus dulu itu.

# sudo apt-get remove ntp

Sekarang tambahkan perintah:

ntpdate -sb time.nist.gov

untuk /etc/rclocal

Mulai ulang. Harus bagus pada saat itu.

Stephan
sumber
jawaban diperbarui.
Stephan
1
Bukankah ntpdate sedang dihapus atau apalah? Juga, Jika saya memahami ini dengan benar, layanan akan berjalan dan memelihara sinkronisasi jam lokal ke jam server - sehingga penyimpangan terikat. Jika Anda menghapus ntp dan menjalankan ntpdate sekali, bukankah itu akan terpengaruh oleh jam yang melayang ketika mesin dihidupkan untuk waktu yang lama?
ysap
Stephan, silakan lihat pembaruan # 2 untuk pertanyaan itu.
ysap
3
Ya, ntpdate sedang dihapus. Penggunaan "ntpd -q" lebih disukai (kedua varian mengharuskan ntpd dihentikan terlebih dahulu).
tgharold
11

Gunakan timedatectl(unit layanan systemd) untuk mengatur waktu. ntpsudah ditinggalkan.

sudo systemctl restart systemd-timesyncd.service

Anda dapat memeriksa waktu pembaruan dengan log journalctl -xe | tail

Referensi

Xiaoyifang
sumber
Ini berfungsi di Ubuntu 19.04. Terima kasih!
Krubo
10
rdate -s tick.greyware.com

jika semua yang ingin Anda lakukan adalah mengatur jam sekali, sederhana

batflaps
sumber
Terima kasih. Saat ini saya tidak memiliki sistem untuk memeriksa perintah ini, tetapi jika Anda mengikuti diskusi dalam pertanyaan dan jawaban yang diterima, Anda akan melihat bahwa masalahnya sebenarnya tidak tersedianya jaringan pada saat menjalankan perintah pembaruan jam.
ysap
Ini memperbaiki masalah sinkronisasi waktu pada Raspberry Pi saya. Terima kasih.
Oliver Spryn
7

Cara yang benar untuk melakukan ini pada sistem Debian / Mint / Ubuntu (atau turunan Debian lainnya) adalah dengan memiliki jalur

NTPD_OPTS="-g"

dalam file

/etc/default/ntp

Ini memastikan bahwa ketika ntpd dimulai dari skrip /etc/init.d/ntp, ntpd dijalankan dengan opsi "-g", yaitu

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

untuk memungkinkan ntpd memperbaiki waktu sistem ketika lebih dari 1000 detik, misalnya ketika waktu sistem 1 Januari 1970 saat startup karena tidak ada RTC perangkat keras.

JG Miller
sumber
Saya sudah memilikinya, tetapi masih mengatakan jam 3 pagi di NY, padahal seharusnya jam 11 malam.
chovy
Saya juga sudah memiliki baris itu /etc/default/ntp, tetapi waktu tidak disinkronkan.
Dawid Ferenczy Rogožan
5

tlsdatemengatur jam lokal dengan menghubungkan dengan aman dengan TLS ke server jarak jauh dan mengekstrak waktu jauh dari jabat tangan yang aman. Tidak seperti ntpdate, tlsdatemenggunakan TCP, misalnya menghubungkan ke layanan yang diaktifkan HTTPS atau TLS jarak jauh, dan menyediakan beberapa perlindungan terhadap musuh yang mencoba memberi Anda informasi waktu berbahaya.

$ tlsdate -V -n -H encrypted.google.com
Kokizzu
sumber
5

Perhatikan bahwa beberapa sistem berbasis Ubuntu saat ini bahkan tidak menggunakan layanan NTP secara default sekarang. Di mesin Linux Mint 19 (Ubuntu 18.04) saya, waktu disimpan oleh systemd-timesyncd.

Jadi untuk mendapatkan waktu terbaru setelah kehilangan sinkronisasi, saya jalankan saja

sudo systemctl restart systemd-timesyncd

Sejak 15,04 Ubuntu menggunakan systemd secara default. Oleh karena itu sistem kritis seperti waktu dikelola melalui systemd. Untuk menemukan layanan apa yang digunakan sistem Anda, jalankan sesuatu seperti

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

Untuk TechJS pada 16,04 layanannya adalah ntp. Untuk saya sendiri di Ubuntu 18.04 (Mint 19) layanannya systemd-timesyncd. Menariknya, saya masuk ke server 16,04 yang saya miliki dan menggunakan systemd-timesyncdjuga.

Aaron Chamberlain
sumber
Terima kasih. Sudah lama sejak memposting pertanyaan, dan saya tidak memiliki sistem yang tersedia untuk pengujian, tetapi dapatkah Anda menguraikan bagaimana jawaban Anda berbeda dari @ TechJS, terutama perintah yang Anda usulkan sedikit berbeda.
ysap
Ha terima kasih. Itu adalah tanggapan untuk Anda tetapi juga kepada siapa saja yang di masa depan menemukan diri mereka di sini tanpa informasi terkini (seperti saya). Saya memperbarui jawaban saya untuk lebih spesifik tentang bagaimana saya mencapai jawaban saya.
Aaron Chamberlain
4

Coba gunakan -bopsi untuk melangkah waktu.

Cry Havok
sumber
2
Ketika mencoba dari baris perintah, saya mendapatkan respon berikut: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Namun, saya pikir saya sudah mencoba ini sebelumnya rc.localtetapi tidak membantu.
ysap
3
Anda harus menghentikan layanan ntp terlebih dahulu sebelum Anda dapat menjalankanntpdate -b <ipaddress>
Wim Deblauwe
2

Baik,

Saya menjalankan raspbian (debian wheezy) pada raspberry pi saya, yang tidak memiliki jam. Saya merasa berguna untuk menulis skrip kecil dan menjalankannya setelah antarmuka internet saya menyala, sehingga saya yakin bahwa saat jaringan tersedia, jam akan diperbarui.

Pertama periksa apakah Anda memiliki ntpdatepaket dengan menjalankan

sudo apt-get update
sudo apt-get install ntpdate

Anda perlu menambahkan yang berikut ke dalam Anda /etc/network/interfaces(pasti di eth0sini hanya sebuah contoh):

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

Dan buat skrip berikut di /usr/local/sbin/update-time.sh(jangan lupa untuk membuatnya bisa dieksekusi oleh 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
art.shutter
sumber
1

Algoritme ntpd membuang offset sampel yang melebihi 128 ms, kecuali interval di mana tidak ada [nilai absolut] offset sampel kurang dari 128 ms melebihi 900 detik. Sampel pertama setelah itu, apa pun offsetnya, langkah jam ke waktu yang ditunjukkan. Dalam prakteknya ini mengurangi tingkat alarm palsu di mana jam di melangkah dalam kesalahan ke insiden yang semakin rendah.

Biasanya, ntpd keluar jika offset melebihi batas kewarasan, yaitu 1000 detik secara default. Ini bisa dimatikan dengan opsi -g:

-g Biasanya, ntpd keluar jika offset melebihi batas kewarasan, yaitu 1000 detik secara default. Jika batas kewarasanan diatur ke nol, tidak ada pemeriksaan kewarasan dilakukan dan offset apa pun dapat diterima. Opsi ini mengesampingkan batas dan memungkinkan waktu diatur ke nilai apa pun tanpa batasan; Namun, ini bisa terjadi hanya sekali. Setelah itu, ntpd akan keluar jika batas terlampaui. Opsi ini dapat digunakan dengan opsi -q.

keduanya dari http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Jonathzen
sumber
1

Jika Anda dapat menyediakan waktu untuk menunggu berapa pun waktu yang diperlukan sebelum sistem Anda sinkron, Anda dapat menggunakan ntp-waitperintah:

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.
Anonim, tanpa nama
sumber
1

Jika Anda menggunakan systemd, Anda dapat menggunakan perintah ini:

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

Dan kemudian waktu diperbarui dalam waktu dekat 10-15 detik.
Diuji pada ubuntu mate 16.04

AmirHossein
sumber
0

ntpddan ntpdatedijalankan secara default menggunakan port terbatas (UDP 123). Jika Anda berada di belakang firewall, ntpdtidak akan pernah berfungsi, tetapi ntpdatedapat bekerja dengan -uopsi tersebut. Misalnya: ntpdate -u 0.ubuntu.pool.ntp.org atau ntpdate -u time.nist.govkeduanya harus bekerja dengan baik.

GN DeSouza
sumber