Kompilieren von C ++ auf einem Remote-Linux-Computer - Warnung "Zeitversatz erkannt"


168

Ich bin über PuTTY und WinSCP mit dem kleinen Linux-Cluster meiner Universität verbunden, übertrage Dateien mit letzterem und kompiliere und führe sie mit ersteren aus. Meine bisherige Arbeit wurde in den Labors der Universität durchgeführt, aber heute habe ich zu Hause gearbeitet, was eine interessante Warnung hervorgerufen hat.

Ich habe einen ganzen Ordner mit Dingen hochgeladen und beim Ausführen des makeBefehls erhalte ich diesen als letzte Ausgabezeile:

make: Warnung: Zeitversatz erkannt. Ihr Build ist möglicherweise unvollständig.

Die resultierende Binärdatei funktioniert ordnungsgemäß und es scheint keine weiteren unerwarteten Fehler im Erstellungsprozess zu geben.

Ich scheine in der Lage zu sein, den Fehler durch Erstellen nach dem Hochladen einiger neuer / Ersatzdateien auszulösen (ich bearbeite alles lokal und lade dann die neue Version hoch). Ich frage mich also, ob dies genauso einfach ist wie nicht übereinstimmende Dateimodifikationszeiten. Oder etwas Besorgniserregenderes?

Also, sollte ich mir Sorgen machen? Wie kann ich das beheben / verhindern?


Uhrendifferenzen sind eine Möglichkeit, wie in einigen Antworten erwähnt. Sie können auch die Änderungszeiten der Quelldateien vor und nach dem Kopieren vergleichen. Möglicherweise stellen Sie fest, dass sie eine Stunde unterschiedlich sind, da die beiden Betriebssysteme / Dateisysteme die Sommerzeit unterschiedlich behandeln.
Steve Jessop

Ein letzter Vorschlag: Ich habe keine Windows-Computer, daher bin ich mit den Funktionen von PuTTY und WinSCP nicht vertraut, aber häufig verfügen Dateiübertragungstools über Optionen, mit denen Sie steuern können, ob die geänderte Zeit beibehalten wird oder nicht. Ihre Mod-Zeiten bleiben natürlich erhalten, aber wenn Sie dies deaktivieren können, werden beim Kopieren der Dateien auf Ihr System die von Ihrer Systemuhr festgelegten Mod-Zeiten verwendet, nicht die Remote-Systemuhr.
MadScientist

Antworten:


206

Diese Meldung ist normalerweise ein Hinweis darauf, dass einige Ihrer Dateien später als die aktuelle Systemzeit geändert wurden. Da makeentschieden wird, welche Dateien beim Ausführen eines inkrementellen Builds kompiliert werden sollen, indem überprüft wird, ob eine Quelldatei in jüngerer Zeit als ihre Objektdatei geändert wurde, kann diese Situation dazu führen, dass unnötige Dateien erstellt werden oder, schlimmer noch, notwendige Dateien nicht erstellt werden.

Wenn Sie jedoch von Grund auf neu erstellen (ohne inkrementelle Erstellung), können Sie diese Warnung wahrscheinlich ohne Konsequenz ignorieren.


4
Es scheint, dass der Cluster eine Zeit von ~ 3 Minuten hinter meinem Desktop hat, daher scheinen Dateien, die in der "Zukunft" geändert wurden, eine wahrscheinliche Ursache zu sein. Ist es dann am sichersten, nach dem Hochladen etwa 5 Minuten zu warten, bevor ein Build ausgeführt wird? Ich möchte lieber nicht warten müssen. Gibt es also eine Möglichkeit, die Zeiten für hochgeladene "zukünftige" Dateien zurückzusetzen, um das Problem zu vermeiden?
DMA57361

14
@ DMA57361: touch *Aktualisiert die Zeiten auf die aktuelle Zeit. Alternativ können Sie NTP auf Ihrem Desktop aktivieren, um Ihre Uhr zu synchronisieren (vorausgesetzt, es ist Ihr Desktop, der falsch ist, und nicht der Uni-Computer ... wenn letzterer, bitten Sie vielleicht die Systemadministratoren, das Problem zu beheben?)
caf

2
Vielen Dank dafür, touch *es ist fürs Erste, und ich werde sehen, ob ich herausfinden kann, was falsch ist, und vielleicht das nächste Mal, wenn ich vor Ort bin, mit dem Administrator sprechen.
DMA57361

1
Ich brauchte eine rekursive Note in meinem Fall:find . -exec touch {} \;
ams

8
@AaronS für solche Befehle touchkönnen mehrere Dateien akzeptieren, auf die reagiert werden kann. Sie können dies (viel) effizienter ausführen find . -exec touch {} +, touchwobei so viele Argumente wie möglich aufgerufen werden.
Viktor Dahl

56

In der Regel tritt dies auf, wenn ein in NFS bereitgestelltes Verzeichnis erstellt wird und die Uhren auf dem Client und dem NFS-Server nicht synchron sind.

Die Lösung besteht darin, einen NTP-Client sowohl auf dem NFS-Server als auch auf allen Clients auszuführen.


1
Ich baue nicht auf einem NFS-Mount-Verzeichnis auf.
Kingsmasher1

Lassen Sie mich wissen, ob Sie einige Tipps geben können, um eine solche Warnung zu unterdrücken, da dies keinen Unterschied in der Ausführung oder den Ergebnissen macht.
Kingsmasher1

@ kingsmasher1: Führen Sie auf allen beteiligten Computern einen NTP-Client aus.
Janneb

Ich habe gerade mein Ziel überprüft. Das Datum ist nicht festgelegt. Ich bin nicht sicher, wie ich NTP hier ausführen soll. Ist es in Ordnung, wenn ich das Datum aktualisiere? Mein x86, wo ich baue, ist auf das aktuelle Datum eingestellt, aber mein Ziel (wo ich es ausführe) hat ein Datum von soem 1970's.
Kingsmasher1

1
Das Problem ist sortiert. Ich habe mein Zieldatum auf das aktuelle Datum geändert und die Warnung ist verschwunden. Das Problem ist also: Wenn das Zieldatum ein Rückdatum als das ausführbare Datum ist, tritt das Problem auf.
Kingsmasher1

22

Installieren Sie das Network Time Protocol

Dies ist mir auch passiert, als ich makeauf einer Samba SMB CIFS-Freigabe auf einem Server ausgeführt wurde. Eine dauerhafte Lösung besteht darin, den ntpDämon sowohl auf dem Server als auch auf dem Client zu installieren . (Bitte beachten Sie, dass dieses Problem nicht durch Ausführen behoben wird ntpdate. Dadurch wird der Zeitunterschied nur vorübergehend, jedoch nicht in Zukunft behoben .)

Geben Sie für von Ubuntu und Debian abgeleitete Systeme einfach die folgende Zeile in die Befehlszeile ein:

$ sudo apt install ntp

Darüber hinaus muss der Befehl touch *im betroffenen Verzeichnis noch einmal (und nur einmal) ausgegeben werden, um die Änderungszeiten der Dateien ein für alle Mal zu korrigieren.

$ touch *

Weitere Informationen zu den Unterschieden zwischen ntpund ntpdatefinden Sie unter:



6

Laut Benutzer m9dhatter auf LinuxQuestions.org :

"make" verwendet den Zeitstempel der Datei, um festzustellen, ob die Datei, die kompiliert werden soll, alt oder neu ist. Wenn Ihre Uhr geknickt ist, kann es zu Problemen beim Kompilieren kommen.

Wenn Sie versuchen, Dateien auf einem anderen Computer mit einer um einige Minuten vorausgehenden Uhrzeit zu ändern und sie auf Ihren Computer zu übertragen und dann zu kompilieren, wird möglicherweise eine Warnung ausgegeben, die besagt, dass die Datei aus der Zukunft geändert wurde. Die Uhr ist möglicherweise schief oder etwas in diesem Sinne (kann mich nicht wirklich erinnern). Sie könnten einfach zu der beleidigenden Datei gehen und dies tun:

#touch <Dateiname der fehlerhaften Datei>


6

Die anderen Antworten hier erklären das Problem gut, daher werde ich das hier nicht wiederholen. Es gibt jedoch eine Lösung, die das Problem beheben kann, die noch nicht aufgeführt ist: Einfach ausführen make cleanund dann erneut ausführen make.

Wenn make bereits kompilierte Dateien entfernt, wird verhindert, dass make Dateien zum Vergleichen der Zeitstempel von make hat, wodurch die Warnung behoben wird.


Dies ist keine echte Lösung: Wenn der Compiler 30 Minuten benötigt, um alles zu kompilieren, und ich an einer einzelnen Datei arbeite (wobei der Build nur 2 Sekunden benötigt), werde ich den ganzen Tag damit verschwenden, Änderungen an einem einzelnen Teil von a vorzunehmen riesige Bibliothek. Richtig? Aber ja, mit make cleanIhnen werden Sie die Probleme lösen (indem Sie andere erstellen).
Leos313

@ Leos313 Ich teile nur, was für mich funktioniert hat. Ich bin auf ein Schulnetzwerk gestoßen, für das ich keine Root-Berechtigungen hatte, sodass ich kein NTP einrichten konnte, und ich habe den Kompilierungsergebnissen nicht vertraut, wenn ich nur touchalle Dateien verwendet habe. Sie haben Recht, dass eine vollständige Neukompilierung erforderlich ist, aber ob sich die Zeit lohnt oder nicht, hängt von Ihren Prioritäten und Ihrer Projektgröße ab. Ich denke nicht, dass es richtig ist zu sagen, dass es "keine echte Lösung" ist, nur weil es nicht das Beste ist oder einige Nachteile hat. Es wird das Problem beheben; klingt für mich nach einer Lösung.
skrrgwasme

Ich habe nicht abgestimmt :) Es löst das Problem, indem es andere erstellt. Nichts weiter als das! :) sicher wird die Antwort in den meisten Situationen helfen und es lohnt sich, hier zu sein! Was ich unterstreichen möchte und manchmal ist es besser, bei der Warnung zu bleiben als zu rennenmake clean
Leos313

4

Ich hatte dies in der Vergangenheit - aufgrund der Uhren an den Maschinen. Richten Sie NTP so ein, dass alle Computer dieselbe Zeit haben.


2

Dies ist normalerweise einfach auf nicht übereinstimmende Zeiten zwischen Ihrem Host- und Client-Computer zurückzuführen. Sie können versuchen, die Zeiten auf Ihren Computern mit ntp zu synchronisieren .


1

Die Lösung besteht darin, einen NTP-Client auszuführen. Führen Sie einfach den folgenden Befehl aus

#ntpdate 172.16.12.100

172.16.12.100 ist der NTP-Server


2
Willkommen bei Stack Overflow! Danke für deinen Beitrag! Bitte verwenden Sie in Ihren Posts keine Signaturen / Slogans. Ihre Benutzerbox zählt als Ihre Signatur, und Sie können Ihr Profil verwenden, um Informationen über sich selbst zu veröffentlichen, die Sie mögen. FAQ zu Unterschriften / Slogans
Andrew Barber

Die Verwendung ntpdateist nur eine einmalige Korrektur. Es ist besser, ntpsowohl auf dem Server als auch auf dem Client zu installieren , um eine dauerhafte Lösung zu erhalten.
Serge Stroobandt

1

Ersetzen Sie die Batterie der Uhr in Ihrem Computer. Ich habe diese Fehlermeldung gesehen, als die Münzbatterie auf dem Motherboard ausgetauscht werden musste.


1

(Nur für den Fall, dass jemand hier landet) Wenn Sie Sudo-Rechte haben, können Sie die Systemzeit synchronisieren

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

-1

Überprüfen Sie, ob das Ergebnis der Kompilierung, z. B. somefile.o, älter als die Quelle ist, z. B. somefile.c. Die obige Warnung bedeutet, dass etwas über die Zeitstapel der Dateien seltsam ist. Wahrscheinlich unterscheiden sich die Systemuhren des Universitätsservers von Ihrer Uhr und Sie pushen beispielsweise um 13 Uhr eine Datei mit dem Änderungsdatum 14 Uhr. Sie können die Uhrzeit an der Konsole anzeigen, indem Sie das Datum eingeben.


-3

Das ist mir passiert. Das liegt daran, dass ich gelaufen bin make -j 4und einige Jobs nicht mehr in Ordnung waren. Diese Warnung sollte bei Verwendung der -jOption erwartet werden .


5
Jobs, die nicht in Ordnung sind, sind in Ordnung. Das bedeutet nicht, dass ihre Änderungszeit in der Zukunft liegen sollte.
klimkin

@klimkin Warum nicht? Ich denke, einige Prozessoren haben die Bauteile fertiggestellt, bevor andere Prozessoren gestartet wurden.
Kilojoule
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.