Biên dịch C ++ trên máy Linux từ xa - Phát hiện đồng hồ lệch xiên


168

Tôi được kết nối với cụm Linux nhỏ của trường đại học của tôi thông qua PuTTY và WinSCP, chuyển các tệp bằng cách sử dụng cái sau và biên dịch và chạy chúng với cái trước. Công việc của tôi cho đến nay đã được thực hiện trong phòng thí nghiệm của trường đại học, nhưng hôm nay tôi đã làm một số công việc tại nhà tạo ra một cảnh báo thú vị.

Tôi đã tải lên toàn bộ thư mục của công cụ và khi chạy makelệnh, tôi nhận đây là dòng đầu ra cuối cùng:

thực hiện: cảnh báo: Phát hiện lệch đồng hồ. Bản dựng của bạn có thể không đầy đủ.

Kết quả nhị phân hoạt động chính xác và dường như không có bất kỳ lỗi không mong muốn nào khác trong quá trình xây dựng.

Tôi dường như có thể kích hoạt lỗi bằng cách xây dựng sau khi tải lên một số tệp mới / thay thế (tôi chỉnh sửa mọi thứ cục bộ sau đó tải lên phiên bản mới), vì vậy tôi tự hỏi liệu nó có đơn giản như thời gian sửa đổi tệp không khớp không? Hoặc một cái gì đó liên quan nhiều hơn?

Vì vậy, tôi có nên lo lắng? Làm cách nào để khắc phục / ngăn chặn điều này?


Sự khác biệt đồng hồ là một khả năng, như được đề cập trong một số câu trả lời. Bạn cũng có thể so sánh thời gian sửa đổi của các tệp nguồn trước và sau khi sao chép - bạn có thể thấy rằng chúng khác nhau một giờ do hai hệ điều hành / hệ thống tệp xử lý tiết kiệm ánh sáng ban ngày khác nhau.
Steve Jessop

Một đề nghị cuối cùng: Tôi không có bất kỳ máy Windows nào vì vậy tôi không quen với các khả năng của PuTTY và WinSCP, nhưng thường các công cụ truyền tệp có các tùy chọn cho phép bạn kiểm soát thời gian sửa đổi có được giữ nguyên hay không. Thời gian mod của bạn rõ ràng được bảo toàn, nhưng nếu bạn có thể tắt nó đi thì khi các tệp được sao chép vào hệ thống của bạn, họ sẽ sử dụng thời gian mod được đặt bởi đồng hồ hệ thống của bạn chứ không phải đồng hồ hệ thống từ xa.
MadSellectist

Câu trả lời:


206

Thông báo đó thường là một dấu hiệu cho thấy một số tệp của bạn có thời gian sửa đổi muộn hơn thời gian hệ thống hiện tại. Do makequyết định biên dịch tệp nào khi thực hiện xây dựng gia tăng bằng cách kiểm tra xem tệp nguồn đã được sửa đổi gần đây hơn tệp đối tượng hay chưa, tình huống này có thể khiến các tệp không cần thiết được xây dựng hoặc tệ hơn là các tệp cần thiết không được xây dựng.

Tuy nhiên, nếu bạn đang xây dựng từ đầu (không thực hiện xây dựng gia tăng), bạn có thể bỏ qua cảnh báo này mà không có hậu quả.


4
Có vẻ như cụm có thời gian ~ 3 phút phía sau máy tính để bàn của tôi, vì vậy các tệp đã được sửa đổi trong "tương lai" có vẻ là một nguyên nhân có thể. Là đặt cược an toàn nhất sau đó chờ 5 phút hoặc lâu hơn sau khi tải lên bất cứ điều gì trước khi chạy một bản dựng? Tôi không muốn phải chờ đợi, vậy có cách nào để đặt lại thời gian trên bất kỳ tệp "tương lai" nào được tải lên để tránh sự cố không?
DMA57361

14
@ DMA57361: touch *sẽ cập nhật mtimes đến thời điểm hiện tại. Ngoài ra, bạn có thể kích hoạt NTP trên máy tính để bàn của mình để đồng bộ hóa đồng hồ của bạn (giả sử máy tính để bàn của bạn sai và không phải là máy của Uni ... nếu sau này, có thể yêu cầu sysadmin sửa nó không?)
caf

2
Cảm ơn vì điều đó, touch *bây giờ là bây giờ, và tôi sẽ xem liệu tôi có thể tìm ra cái nào sai và có thể có một lời nói với anh chàng quản trị viên lần sau khi tôi ở trên trang web không.
DMA57361

1
Tôi cần một liên lạc đệ quy trong trường hợp của tôi:find . -exec touch {} \;
am

8
@AaronS cho các lệnh như thế touchcó thể chấp nhận nhiều tệp để hành động, bạn có thể thực hiện (nhiều) hiệu quả hơn với lệnh find . -exec touch {} +này sẽ gọi touchvới càng nhiều đối số càng tốt.
Viktor Dahl

56

Thông thường, điều này xảy ra khi xây dựng trong thư mục được gắn NFS và đồng hồ trên máy khách và máy chủ NFS không đồng bộ.

Giải pháp là chạy một máy khách NTP trên cả máy chủ NFS và tất cả các máy khách.


1
Tôi không xây dựng trên bất kỳ thư mục gắn NFS.
kingsmasher1

Hãy cho tôi biết nếu bạn có thể đưa ra một số mẹo để loại bỏ cảnh báo như vậy, vì nó thực sự không tạo ra bất kỳ sự khác biệt nào trong việc thực hiện hoặc kết quả.
kingsmasher1

@ kingsmasher1: Chạy ứng dụng khách NTP trên tất cả các máy liên quan.
janneb

Tôi chỉ kiểm tra mục tiêu của tôi. Ngày không được đặt. Tôi không chắc làm thế nào để chạy NTP ở đây. Có ổn không, nếu tôi cập nhật ngày? X86 của tôi nơi tôi xây dựng được đặt thành ngày hiện tại, nhưng mục tiêu của tôi (nơi tôi thực hiện) có ngày soem 1970.
kingsmasher1

1
Vấn đề được sắp xếp. Tôi đã thay đổi ngày mục tiêu của mình thành ngày hiện tại và cảnh báo đã biến mất. Vì vậy, vấn đề là: Nếu ngày đích là ngày trở lại so với ngày thực thi, thì sự cố sẽ xảy ra.
kingsmasher1

22

Cài đặt giao thức thời gian mạng

Điều này cũng xảy ra với tôi khi chạy maketrên chia sẻ Samba SMB CIFS trên máy chủ. Một giải pháp bền bỉ bao gồm cài đặt ntpdaemon trên cả máy chủ và máy khách. (Xin lưu ý rằng vấn đề này không được giải quyết bằng cách chạy ntpdate. Điều này sẽ giải quyết sự khác biệt thời gian chỉ tạm thời, nhưng không phải trong tương lai.)

Đối với các hệ thống có nguồn gốc từ Ubuntu và Debian, chỉ cần nhập dòng sau vào dòng lệnh:

$ sudo apt install ntp

Hơn nữa, người ta vẫn sẽ cần phải ban hành lệnh touch *một lần (và chỉ một lần) trong thư mục bị ảnh hưởng để sửa lỗi thời gian sửa đổi tệp một lần và mãi mãi.

$ touch *

Để biết thêm thông tin về sự khác biệt giữa ntpntpdate, vui lòng tham khảo:



6

Theo người dùng m9dhatter trên LinuxQuestions.org :

"Make" sử dụng dấu thời gian của tệp để xác định xem tệp đang cố biên dịch là cũ hay mới. nếu đồng hồ của bạn bị bon bon, nó có thể có vấn đề biên dịch.

nếu bạn cố gắng sửa đổi các tệp ở một máy khác với thời gian trước một vài phút và chuyển chúng vào máy của bạn và sau đó cố gắng biên dịch thì có thể cảnh báo rằng tệp đã được sửa đổi từ tương lai. đồng hồ có thể bị lệch hoặc một cái gì đó cho hiệu ứng đó (không thể thực sự nhớ). bạn chỉ có thể vào tập tin vi phạm và làm điều này:

#touch <tên tệp của tệp vi phạm>


6

Các câu trả lời khác ở đây làm tốt công việc giải thích vấn đề, vì vậy tôi sẽ không nhắc lại ở đây. Nhưng có một giải pháp có thể giải quyết nó chưa được liệt kê: chỉ cần chạy make clean, sau đó chạy lại make.

Việc xóa bất kỳ tệp nào đã được biên dịch sẽ ngăn không cho bất kỳ tệp nào so sánh dấu thời gian của, giải quyết cảnh báo.


đây không phải là một giải pháp thực sự: nếu trình biên dịch cần 30 phút để biên dịch mọi thứ và tôi đang làm việc trên một tệp duy nhất (trong đó bản dựng chỉ cần 2 giây) Tôi sẽ lãng phí cả ngày để sửa đổi một phần của một thư viện khổng lồ. Đúng? Tuy nhiên, có, với make cleanbạn sẽ giải quyết các vấn đề (bằng cách tạo người khác).
Leos313

@ Leos313 Tôi chỉ chia sẻ những gì làm việc cho tôi. Tôi đã gặp nó trên mạng trường học mà tôi không có quyền root vì vậy tôi không thể thiết lập NTP và tôi không tin tưởng vào kết quả biên dịch chỉ sử dụng touchtrên tất cả các tệp. Bạn đúng rằng nó sẽ yêu cầu biên dịch lại đầy đủ, nhưng liệu thời gian đó có đáng hay không sẽ thay đổi tùy thuộc vào mức độ ưu tiên và quy mô dự án của bạn. Tôi không nghĩ chính xác khi nói rằng "không phải là một giải pháp thực sự" chỉ vì nó không phải là tốt nhất hoặc có một số nhược điểm. Nó sẽ khắc phục vấn đề; Nghe có vẻ là một giải pháp cho tôi.
skrrgwasme

Tôi đã không bỏ phiếu xuống :) nó giải quyết vấn đề bằng cách tạo ra những người khác. Không có gì hơn thế này! :) chắc chắn câu trả lời sẽ giúp ích trong hầu hết các tình huống và nó đáng để ở đây! Những gì tôi muốn gạch chân và đôi khi, tốt hơn là ở lại với cảnh báo hơn là chạymake clean
Leos313

4

Tôi đã có điều này trong quá khứ - do đồng hồ bị tắt trên máy. Cân nhắc việc thiết lập NTP để tất cả các máy có cùng thời gian.


2

Điều này thường đơn giản là do thời gian không khớp giữa máy chủ và máy khách của bạn. Bạn có thể thử đồng bộ hóa thời gian trên máy bằng ntp .


1

Giải pháp là chạy máy khách NTP, chỉ cần chạy lệnh như dưới đây

#ntpdate 172.16.12.100

172.16.12.100 là máy chủ ntp


2
Chào mừng bạn đến với Stack Overflow! Cảm ơn bài viết của bạn! Vui lòng không sử dụng chữ ký / khẩu hiệu trong bài viết của bạn. Hộp người dùng của bạn được tính là chữ ký của bạn và bạn có thể sử dụng hồ sơ của mình để đăng bất kỳ thông tin nào về bản thân bạn muốn. Câu hỏi thường gặp về chữ ký / khẩu hiệu
Andrew Barber

Sử dụng ntpdatechỉ là một điều chỉnh tắt. Tốt hơn là cài đặt ntptrên cả máy chủ và máy khách để có được giải pháp lâu bền.
Serge Stroobandt

1

Thay pin đồng hồ trong máy tính của bạn. Tôi đã thấy thông báo lỗi này khi đồng xu tìm pin trên bo mạch chủ đang cần thay thế.


1

(Chỉ trong trường hợp bất kỳ ai hạ cánh ở đây) Nếu bạn có quyền sudo, một tùy chọn là đồng bộ hóa thời gian hệ thống

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

-1

Thực hiện kiểm tra nếu kết quả của quá trình biên dịch, ví dụ somefile.o, cũ hơn nguồn, ví dụ somefile.c. Cảnh báo ở trên có nghĩa là một cái gì đó về dấu thời gian của các tệp là lạ. Có lẽ đồng hồ hệ thống của máy chủ Đại học khác với đồng hồ của bạn và bạn ví dụ đẩy vào lúc 1 giờ chiều một tệp có ngày sửa đổi 2 giờ chiều. Bạn có thể xem thời gian tại bàn điều khiển bằng cách gõ ngày.


-3

Điều này đã xảy ra với tôi. Đó là bởi vì tôi đã chạy make -j 4và một số công việc đã hoàn thành không theo thứ tự. Cảnh báo này nên được dự kiến ​​khi sử dụng -jtùy chọn.


5
Việc làm xong trật tự là ok. Không có nghĩa là thời gian sửa đổi của họ sẽ có trong tương lai.
klimkin

@klimkin Tại sao không? Tôi nghĩ rằng một số bộ xử lý đã hoàn thành việc xây dựng các thành phần trước khi các bộ xử lý khác bắt đầu.
kilojoules
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.