Jestem połączony z małym klastrem Linux na moim uniwersytecie za pośrednictwem PuTTY i WinSCP, przesyłam pliki za pomocą tego ostatniego i kompiluję je i uruchamiam z tym pierwszym. Do tej pory moja praca była wykonywana w laboratoriach uniwersytetu, ale dzisiaj wykonuję w domu pewne prace, które wygenerowały interesujące ostrzeżenie.
Wgrałem cały folder rzeczy i po uruchomieniu make
polecenia otrzymuję to jako ostatnią linię wyniku:
make: warning: Wykryto przesunięcie zegara. Twoja kompilacja może być niekompletna.
Wynikowy plik binarny działa poprawnie i wydaje się, że nie ma żadnych innych nieoczekiwanych błędów w procesie kompilacji.
Wydaje się, że jestem w stanie wywołać błąd, budując po przesłaniu nowych / zastępczych plików (edytuję wszystko lokalnie, a następnie przesyłam nową wersję), więc zastanawiam się, czy to coś tak prostego, jak niedopasowane czasy modyfikacji plików? A może coś bardziej niepokojącego?
Więc czy powinienem się martwić? Jak to naprawić / temu zapobiec?
Odpowiedzi:
Ten komunikat zwykle wskazuje, że niektóre pliki mają modyfikacje późniejsze niż w bieżącym czasie systemowym. Ponieważ
make
decyduje, które pliki skompilować podczas wykonywania kompilacji przyrostowej, sprawdzając, czy pliki źródłowe zostały zmodyfikowane wcześniej niż ich plik obiektowy, ta sytuacja może spowodować, że niepotrzebne pliki zostaną zbudowane lub, co gorsza, niezbędne pliki nie zostaną zbudowane.Jeśli jednak budujesz od zera (nie robisz kompilacji przyrostowej), prawdopodobnie możesz zignorować to ostrzeżenie bez konsekwencji.
źródło
touch *
zaktualizuje czasy mtimes do aktualnego czasu. Alternatywnie możesz włączyć NTP na swoim pulpicie, aby zsynchronizować zegar (zakładając, że to twój pulpit jest zły, a nie maszyna Uni ... jeśli ta ostatnia, może poprosić administratorów systemu o naprawienie tego?)touch *
to na razie i zobaczę, czy uda mi się dowiedzieć, co jest nie tak, i może następnym razem porozmawiam z administratorem.find . -exec touch {} \;
touch
które mogą akceptować wiele plików do działania, możesz to zrobić (znacznie) wydajniej, dziękifind . -exec touch {} +
czemu wywoła siętouch
z jak największą liczbą argumentów.Zwykle ma to miejsce podczas budowania w katalogu zamontowanym w systemie NFS, gdy zegary klienta i serwera NFS nie są zsynchronizowane.
Rozwiązaniem jest uruchomienie klienta NTP zarówno na serwerze NFS, jak i na wszystkich klientach.
źródło
Zainstaluj protokół czasu sieciowego
Zdarzyło mi się to również podczas uruchamiania
make
na udziale Samba SMB CIFS na serwerze. Trwałe rozwiązanie polega na zainstalowaniuntp
demona zarówno na serwerze, jak i na kliencie. (Pamiętaj, że ten problem nie jest rozwiązany przez uruchomienientpdate
. Spowoduje to tylko tymczasowe rozwiązanie różnicy czasu, ale nie w przyszłości).W przypadku systemów Ubuntu i Debian wystarczy wpisać następujący wiersz w wierszu poleceń:
Co więcej, nadal trzeba będzie
touch *
raz na zawsze wydać polecenie (i tylko raz) w katalogu, którego dotyczy problem, aby raz na zawsze skorygować czasy modyfikacji plików.Aby uzyskać więcej informacji na temat różnic między
ntp
intpdate
, zobacz:źródło
Proste rozwiązanie:
zrobi wszystko OK.
Więcej informacji: http://embeddedbuzz.blogspot.in/2012/03/make-warning-clock-skew-detected-your.html
źródło
Według użytkownika m9dhatter na LinuxQuestions.org :
źródło
Inne odpowiedzi tutaj dobrze wyjaśniają problem, więc nie będę tego tutaj powtarzał. Ale jest jedno rozwiązanie, które może rozwiązać ten problem, którego jeszcze nie ma na liście: po prostu uruchom
make clean
, a następnie uruchom ponowniemake
.Usunięcie już skompilowanych plików sprawi, że make nie będzie miał plików do porównania sygnatur czasowych, rozwiązując ostrzeżenie.
źródło
make clean
Tobą rozwiążesz problemy (tworząc inne).touch
wszystkich plików. Masz rację, że będzie to wymagało pełnej rekompilacji, ale to, czy jest to warte czasu, będzie się różnić w zależności od twoich priorytetów i wielkości projektu. Nie sądzę, aby słuszne było stwierdzenie, że to „nie jest prawdziwe rozwiązanie” tylko dlatego, że nie jest najlepsze lub ma pewne wady. To rozwiąże problem; brzmi dla mnie jak rozwiązanie.make clean
Miałem to w przeszłości - z powodu wyłączonych zegarów maszyn. Rozważ skonfigurowanie protokołu NTP, aby wszystkie maszyny miały ten sam czas.
źródło
Zwykle wynika to po prostu z niedopasowania czasów między hostem a komputerami klienckimi. Możesz spróbować zsynchronizować czasy na swoich komputerach za pomocą ntp .
źródło
Rozwiązaniem jest uruchomienie klienta NTP, po prostu uruchom polecenie jak poniżej
172.16.12.100 to serwer ntp
źródło
ntpdate
to tylko jednorazowa korekta. Lepiej jest zainstalowaćntp
zarówno na serwerze, jak i na kliencie, aby uzyskać trwałe rozwiązanie.Wymień baterię zegarka w komputerze. Widziałem ten komunikat o błędzie, gdy wyglądająca na monety bateria na płycie głównej wymagała wymiany.
źródło
(Na wypadek gdyby ktoś tu wylądował) Jeśli masz prawa sudo, jedną z opcji jest synchronizacja czasu systemowego
źródło
Sprawdź, czy wynik kompilacji, np. Somefile.o, jest starszy niż źródło, np. Somefile.c. Powyższe ostrzeżenie oznacza, że coś w synchronizacjach czasowych plików jest dziwne. Prawdopodobnie zegary systemowe serwera Uczelni różnią się od Twojego zegara i np. O godzinie 13 wrzucasz plik z datą modyfikacji o godzinie 14:00. Możesz sprawdzić czas na konsoli, wpisując datę.
źródło
To mi się przydarzyło. To dlatego, że pobiegłem
make -j 4
i niektóre prace zakończyły się niepowodzeniem. Tego ostrzeżenia należy się spodziewać podczas korzystania z-j
opcji.źródło