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?


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.


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.


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:



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>


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.


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.


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 .


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


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.


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"

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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.