Mengkompilasi C ++ pada mesin Linux jarak jauh - peringatan "skew terdeteksi"

168

Saya terhubung ke cluster Linux kecil universitas saya melalui Putty dan WinSCP, mentransfer file menggunakan yang terakhir dan mengkompilasi dan menjalankannya dengan yang pertama. Pekerjaan saya sejauh ini telah dilakukan di laboratorium universitas, tetapi hari ini saya telah melakukan beberapa pekerjaan di rumah yang menghasilkan peringatan yang menarik.

Saya mengunggah seluruh folder barang dan, setelah menjalankan makeperintah, saya mendapatkan ini sebagai baris keluaran terakhir:

make: warning: Kemiringan jam terdeteksi. Bangunan Anda mungkin tidak lengkap.

Biner yang dihasilkan bekerja dengan benar, dan sepertinya tidak ada kesalahan tak terduga lainnya dalam proses membangun.

Saya tampaknya dapat memicu kesalahan dengan membangun setelah mengunggah beberapa file baru / pengganti (saya mengedit semuanya secara lokal kemudian mengunggah versi baru), jadi saya ingin tahu apakah ini sesederhana kali modifikasi file yang tidak cocok? Atau sesuatu yang lebih memprihatinkan?

Jadi, haruskah saya khawatir? Bagaimana cara memperbaiki / mencegah ini?

DMA57361
sumber
Perbedaan jam adalah suatu kemungkinan, sebagaimana disebutkan dalam beberapa jawaban. Anda juga dapat membandingkan waktu modifikasi file sumber sebelum dan setelah menyalin - Anda mungkin menemukan bahwa itu satu jam berbeda karena dua OS / sistem file memperlakukan penghematan siang hari secara berbeda.
Steve Jessop
Satu saran terakhir: Saya tidak punya mesin Windows jadi saya tidak terbiasa dengan kemampuan Putty dan WinSCP, tetapi seringkali alat transfer file memiliki opsi yang memungkinkan Anda untuk mengontrol apakah waktu yang dimodifikasi itu dipertahankan atau tidak. Waktu mod Anda jelas dipertahankan, tetapi jika Anda dapat mematikannya maka ketika file disalin ke sistem Anda, mereka akan menggunakan waktu mod yang diatur oleh jam sistem Anda, bukan jam sistem jarak jauh.
MadScientist

Jawaban:

206

Pesan itu biasanya merupakan indikasi bahwa beberapa file Anda memiliki waktu modifikasi lebih lambat dari waktu sistem saat ini. Karena makememutuskan file mana yang akan dikompilasi ketika melakukan membangun tambahan dengan memeriksa apakah file sumber telah dimodifikasi lebih baru dari file objeknya, situasi ini dapat menyebabkan file yang tidak perlu dibangun, atau lebih buruk, file yang diperlukan tidak dibangun.

Namun, jika Anda membangun dari awal (tidak melakukan pembangunan tambahan), Anda mungkin dapat mengabaikan peringatan ini tanpa konsekuensi.

Tyler McHenry
sumber
4
Tampaknya cluster memiliki waktu ~ 3 menit di belakang desktop saya, jadi file yang telah dimodifikasi di "masa depan" tampaknya kemungkinan penyebabnya. Apakah taruhan paling aman adalah menunggu 5 menit atau lebih setelah mengunggah sesuatu sebelum menjalankan build? Saya lebih suka tidak harus menunggu, jadi apakah ada cara untuk mengatur ulang waktu pada file "masa depan" yang diunggah untuk menghindari masalah?
DMA57361
14
@ DMA57361: touch *akan memperbarui waktu berjalan ke waktu saat ini. Atau Anda dapat mengaktifkan NTP di desktop Anda untuk menyinkronkan jam Anda (dengan anggapan itu adalah desktop Anda yang salah, dan bukan mesin Uni ... jika yang terakhir, mungkin minta sysadmin untuk memperbaikinya?)
caf
2
Terima kasih untuk itu, touch *ini untuk saat ini, dan saya akan melihat apakah saya dapat mengetahui mana yang salah dan mungkin berbicara dengan admin admin lain kali saat saya berada di situs.
DMA57361
1
Aku butuh sentuhan rekursif dalam kasus saya:find . -exec touch {} \;
AMS
8
@ Harun untuk perintah seperti touchitu dapat menerima banyak file untuk ditindaklanjuti , Anda dapat melakukannya (lebih) lebih efisien dengan find . -exec touch {} +yang akan meminta touchargumen sebanyak mungkin.
Viktor Dahl
56

Biasanya ini terjadi ketika membangun direktori yang dipasang NFS, dan jam pada klien dan server NFS tidak sinkron.

Solusinya adalah menjalankan klien NTP di server NFS dan semua klien.

janneb
sumber
1
Saya tidak membangun pada NFS mount dir.
kingsmasher1
Biarkan saya tahu jika Anda dapat memberikan beberapa tips untuk menekan peringatan seperti itu, karena itu benar-benar tidak membuat perbedaan dalam eksekusi atau hasilnya.
kingsmasher1
@ kingsmasher1: Jalankan klien NTP di semua mesin yang terlibat.
janneb
Saya baru saja memeriksa target saya. Tanggal tidak ditentukan. Saya tidak yakin bagaimana menjalankan NTP di sini. Apakah boleh, jika saya memperbarui tanggal? X86 saya di mana saya membangun diatur ke tanggal saat ini, tetapi target saya (di mana saya menjalankan) memiliki tanggal soem 1970-an.
kingsmasher1
1
Masalahnya sudah diurutkan. Saya mengubah tanggal target saya ke tanggal saat ini dan peringatan itu lenyap. Jadi masalahnya adalah: Jika tanggal target adalah tanggal kembali dari tanggal yang dapat dieksekusi, masalahnya terjadi.
kingsmasher1
22

Instal Protokol Waktu Jaringan

Ini juga terjadi pada saya ketika menjalankan makeSIFE SMB CIFS di server. Solusi yang tahan lama terdiri dari menginstal ntpdaemon di server dan klien. (Harap perhatikan bahwa masalah ini tidak diselesaikan dengan menjalankan ntpdate. Ini akan menyelesaikan perbedaan waktu hanya sementara, tetapi tidak di masa mendatang.)

Untuk sistem yang diturunkan dari Ubuntu dan Debian, cukup ketik baris berikut pada baris perintah:

$ sudo apt install ntp

Selain itu, seseorang masih perlu mengeluarkan perintah touch *sekali (dan hanya sekali) di direktori yang terpengaruh untuk memperbaiki waktu modifikasi file sekali dan untuk semua.

$ touch *

Untuk informasi lebih lanjut tentang perbedaan antara ntpdan ntpdate, silakan merujuk ke:

Serge Stroobandt
sumber
6

Menurut pengguna m9dhatter di LinuxQuestions.org :

"make" menggunakan cap waktu file untuk menentukan apakah file yang ingin dikompilasi sudah lama atau baru. jika jam Anda rusak, mungkin ada masalah saat kompilasi.

jika Anda mencoba untuk memodifikasi file di komputer lain dengan waktu jam di depan oleh beberapa menit dan mentransfernya ke mesin Anda dan kemudian mencoba untuk mengkompilasinya mungkin batuk peringatan yang mengatakan file tersebut telah dimodifikasi dari masa depan. jam mungkin condong atau sesuatu untuk efek itu (tidak bisa mengingat). Anda bisa ls ke file yang menyinggung dan melakukan ini:

#touch <nama file file yang menyinggung>

z -
sumber
6

Jawaban lain di sini sangat membantu dalam menjelaskan masalah ini, jadi saya tidak akan mengulanginya di sini. Tetapi ada satu solusi yang dapat menyelesaikannya yang belum terdaftar: jalankan saja make clean, lalu jalankan kembali make.

Setelah menghapus semua file yang sudah dikompilasi akan mencegah make memiliki file untuk membandingkan cap waktu, menyelesaikan peringatan.

skrrgwasme
sumber
ini bukan solusi nyata: jika kompiler memerlukan 30 menit untuk mengkompilasi semuanya dan saya bekerja pada satu file (di mana build membutuhkan 2 detik saja) saya akan menghabiskan sepanjang hari untuk melakukan modifikasi pada satu bagian dari sebuah perpustakaan besar. Baik? Namun ya, dengan make cleanAnda akan menyelesaikan masalah (dengan membuat orang lain).
Leos313
@ Leos313 Saya hanya berbagi apa yang berhasil untuk saya. Saya menemukannya di jaringan sekolah yang saya tidak punya izin root sehingga saya tidak bisa mengatur NTP, dan saya tidak percaya hasil kompilasi hanya menggunakan touchpada semua file. Anda benar bahwa itu akan memerlukan kompilasi ulang penuh, tetapi apakah itu layak atau tidak waktu akan bervariasi tergantung pada prioritas dan ukuran proyek Anda. Saya tidak berpikir itu tepat untuk mengatakan itu "bukan solusi nyata" hanya karena itu bukan yang terbaik atau memiliki beberapa kekurangan. Itu akan memperbaiki masalah; Kedengarannya seperti solusi bagi saya.
skrrgwasme
Saya tidak memilih :) itu menyelesaikan masalah dengan membuat yang lain. Tidak lebih dari ini! :) pasti jawabannya akan membantu dalam sebagian besar situasi dan layak berada di sini! Apa yang ingin saya garis bawahi dan, kadang-kadang, lebih baik untuk tetap dengan peringatan daripada menjalankanmake clean
Leos313
4

Saya memiliki ini di masa lalu - karena jam berada di mesin. Pertimbangkan pengaturan NTP agar semua mesin memiliki waktu yang sama.

Ed Heal
sumber
2

Ini biasanya hanya karena ketidakcocokan waktu antara host Anda dan mesin klien. Anda dapat mencoba menyinkronkan waktu pada mesin Anda menggunakan ntp .

Soo Wei Tan
sumber
1

Solusinya adalah menjalankan klien NTP, jalankan saja perintah seperti di bawah ini

#ntpdate 172.16.12.100

172.16.12.100 adalah server ntp

Surjit
sumber
2
Selamat Datang di Stack Overflow! Terima kasih untuk kiriman Anda! Tolong jangan gunakan tanda tangan / tagline dalam posting Anda. Kotak pengguna Anda dianggap sebagai tanda tangan Anda, dan Anda dapat menggunakan profil Anda untuk memposting informasi tentang diri Anda sendiri. FAQ tentang tanda tangan / tagline
Andrew Barber
Menggunakan ntpdatehanya koreksi satu kali. Lebih baik menginstal ntppada server dan klien untuk mendapatkan solusi yang tahan lama.
Serge Stroobandt
1

Ganti baterai arloji di komputer Anda. Saya telah melihat pesan kesalahan ini ketika koin mencari baterai pada motherboard membutuhkan penggantian.

Blushonine
sumber
1

(Untuk berjaga-jaga kalau ada yang mendarat di sini) Jika Anda memiliki hak sudo, satu opsi adalah menyinkronkan waktu sistem

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

Lakukan pengecekan jika hasil kompilasi, mis. Somefile.o, lebih tua dari sumbernya, mis. Somefile.c. Peringatan di atas berarti ada sesuatu tentang timestaps file yang aneh. Mungkin jam sistem dari server Universitas berbeda dari jam Anda dan Anda misalnya mendorong pukul 1 siang file dengan tanggal modifikasi jam 2 siang. Anda dapat melihat waktu di konsol dengan mengetik tanggal.

fschmitt
sumber
-3

Ini terjadi pada saya. Itu karena saya berlari make -j 4dan beberapa pekerjaan selesai rusak. Peringatan ini harus diharapkan saat menggunakan -jopsi.

kilojoule
sumber
5
Pekerjaan selesai sudah beres. Bukan berarti waktu modifikasi mereka harus di masa depan.
klimkin
@ klimkin Kenapa tidak? Saya pikir beberapa prosesor selesai membangun komponen sebelum prosesor lain dimulai.
kilojoules