Kompilowanie C ++ na zdalnym komputerze z systemem Linux - ostrzeżenie „wykryto przesunięcie zegara”

168

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 makepolecenia 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?

DMA57361
źródło
Możliwe są różnice w zegarze, jak wspomniano w niektórych odpowiedziach. Możesz także porównać czasy modyfikacji plików źródłowych przed i po skopiowaniu - może się okazać, że różnią się one o godzinę ze względu na dwa systemy operacyjne / pliki inaczej traktujące czas letni.
Steve Jessop
Ostatnia sugestia: nie mam żadnych komputerów z systemem Windows, więc nie jestem zaznajomiony z możliwościami PuTTY i WinSCP, ale często narzędzia do przesyłania plików mają opcje, które pozwalają kontrolować, czy zmodyfikowany czas jest zachowywany, czy nie. Twoje czasy modyfikacji są oczywiście zachowane, ale jeśli możesz to wyłączyć, wtedy kiedy pliki zostaną skopiowane do twojego systemu, będą one używać czasów mod ustawionych przez twój zegar systemowy, a nie zdalny zegar systemowy.
MadScientist

Odpowiedzi:

206

Ten komunikat zwykle wskazuje, że niektóre pliki mają modyfikacje późniejsze niż w bieżącym czasie systemowym. Ponieważ makedecyduje, 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.

Tyler McHenry
źródło
4
Wygląda na to, że klaster ma czas ~ 3 minuty za moim pulpitem, więc pliki zmodyfikowane w „przyszłości” wydają się prawdopodobną przyczyną. Czy najbezpieczniejszym rozwiązaniem jest odczekanie około 5 minut po przesłaniu czegokolwiek przed uruchomieniem kompilacji? Wolałbym nie musieć czekać, więc czy jest jakiś sposób na zresetowanie czasów dla jakichkolwiek przesłanych „przyszłych” plików, aby uniknąć problemu?
DMA57361
14
@ DMA57361: 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?)
caf
2
Dzięki za to, touch *to na razie i zobaczę, czy uda mi się dowiedzieć, co jest nie tak, i może następnym razem porozmawiam z administratorem.
DMA57361
1
Potrzebowałem rekurencyjną dotyk w moim przypadku:find . -exec touch {} \;
AMS
8
@AaronS dla poleceń takich jak ta, touchktóre mogą akceptować wiele plików do działania, możesz to zrobić (znacznie) wydajniej, dzięki find . -exec touch {} +czemu wywoła się touchz jak największą liczbą argumentów.
Viktor Dahl
56

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.

janneb
źródło
1
Nie buduję na żadnym reżimie zamontowanym na NFS.
kingsmasher1
Daj mi znać, czy możesz udzielić wskazówek, jak zlikwidować takie ostrzeżenie, ponieważ tak naprawdę nie ma to żadnego wpływu na wykonanie ani wyniki.
kingsmasher1
@ kingsmasher1: Uruchom klienta NTP na wszystkich zaangażowanych komputerach.
janneb
Właśnie sprawdziłem swój cel. Data nie jest ustawiona. Nie jestem pewien, jak uruchomić tutaj NTP. Czy będzie dobrze, jeśli zaktualizuję datę? Mój x86, na którym buduję, jest ustawiony na bieżącą datę, ale mój cel (gdzie wykonuję) ma datę soem 1970.
kingsmasher1
1
Problem został rozwiązany. Zmieniłem datę docelową na aktualną i ostrzeżenie zniknęło. Tak więc problem jest następujący: jeśli data docelowa jest datą wsteczną niż data wykonywalna, problem występuje.
kingsmasher1
22

Zainstaluj protokół czasu sieciowego

Zdarzyło mi się to również podczas uruchamiania makena 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ń:

$ sudo apt install ntp

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.

$ touch *

Aby uzyskać więcej informacji na temat różnic między ntpi ntpdate, zobacz:

Serge Stroobandt
źródło
6

Według użytkownika m9dhatter na LinuxQuestions.org :

"make" używa znacznika czasu pliku do określenia, czy plik, który próbuje skompilować, jest stary czy nowy. jeśli twój zegar jest zbity, może to mieć problemy z kompilacją.

jeśli spróbujesz zmodyfikować pliki na innym komputerze z czasem do przodu o kilka minut i prześlesz je na swój komputer, a następnie spróbujesz skompilować, może pojawić się ostrzeżenie, że plik został zmodyfikowany w przyszłości. zegar może być przekrzywiony lub coś w tym stylu (naprawdę nie pamiętam). możesz po prostu przejść do pliku powodującego problem i zrobić to:

#touch <nazwa pliku powodującego problem>

z -
źródło
6

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 ponownie make.

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.

skrrgwasme
źródło
to nie jest prawdziwe rozwiązanie: jeśli kompilator potrzebuje 30 minut na skompilowanie wszystkiego, a ja pracuję na jednym pliku (gdzie kompilacja wymaga tylko 2 sekund), będę marnował cały dzień na modyfikację jednej części pliku ogromna biblioteka. Dobrze? Jednak tak, razem z make cleanTobą rozwiążesz problemy (tworząc inne).
Leos313
@ Leos313 Po prostu dzielę się tym, co zadziałało dla mnie. Napotkałem go w sieci szkolnej, w której nie miałem uprawnień roota, więc nie mogłem skonfigurować NTP i nie ufałem wynikom kompilacji po prostu używaniu touchwszystkich 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.
skrrgwasme
Nie głosowałem przeciw :) rozwiązuje problem, tworząc inne. Nic więcej niż to! :) na pewno odpowiedź pomoże w większości sytuacji i warto tu być! Co chcę podkreślić, a czasem lepiej trzymać się ostrzeżenia niż biegaćmake clean
Leos313
4

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.

Ed Heal
źródło
2

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 .

Soo Wei Tan
źródło
1

Rozwiązaniem jest uruchomienie klienta NTP, po prostu uruchom polecenie jak poniżej

#ntpdate 172.16.12.100

172.16.12.100 to serwer ntp

Surjit
źródło
2
Witamy w Stack Overflow! Dzięki za Twój post! Prosimy nie używać podpisów / sloganów w swoich postach. Twoja skrzynka użytkownika liczy się jako Twój podpis i możesz używać swojego profilu do publikowania dowolnych informacji o sobie. Często zadawane pytania dotyczące podpisów / sloganów
Andrew Barber
Użycie ntpdateto tylko jednorazowa korekta. Lepiej jest zainstalować ntpzarówno na serwerze, jak i na kliencie, aby uzyskać trwałe rozwiązanie.
Serge Stroobandt
1

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.

BlushONine
źródło
1

(Na wypadek gdyby ktoś tu wylądował) Jeśli masz prawa sudo, jedną z opcji jest synchronizacja czasu systemowego

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

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

fschmitt
źródło
-3

To mi się przydarzyło. To dlatego, że pobiegłem make -j 4i niektóre prace zakończyły się niepowodzeniem. Tego ostrzeżenia należy się spodziewać podczas korzystania z -jopcji.

kilodżule
źródło
5
Prace zakończone poza kolejnością są w porządku. Nie oznacza to, że ich czas modyfikacji powinien nastąpić w przyszłości.
klimkin
@klimkin Dlaczego nie? Myślę, że niektórzy procesorzy skończyli budować komponenty, zanim inne zaczęły.
kilodżule