Compilation de C ++ sur une machine Linux distante - avertissement «décalage d'horloge détecté»

168

Je suis connecté au petit cluster Linux de mon université via PuTTY et WinSCP, transférant des fichiers en utilisant ce dernier et en les compilant et en les exécutant avec le premier. Jusqu'à présent, mon travail a été effectué dans les laboratoires de l'université, mais aujourd'hui, je fais un travail à la maison qui a généré un avertissement intéressant.

J'ai téléchargé un dossier entier de choses et, lors de l'exécution de la makecommande, j'obtiens ceci comme dernière ligne de sortie:

make: avertissement: décalage d'horloge détecté. Votre build peut être incomplet.

Le binaire résultant fonctionne correctement et il ne semble pas y avoir d'autres erreurs inattendues dans le processus de construction.

Il semble que je puisse déclencher l'erreur en construisant après le téléchargement de nouveaux fichiers / fichiers de remplacement (je modifie tout localement puis télécharge la nouvelle version), alors je me demande si c'est quelque chose d'aussi simple que des heures de modification de fichiers incompatibles? Ou quelque chose de plus inquiétant?

Alors, devrais-je m'inquiéter? Comment résoudre / empêcher cela?

DMA57361
la source
Les différences d'horloge sont une possibilité, comme mentionné dans certaines des réponses. Vous pouvez également comparer les heures de modification des fichiers source avant et après la copie - vous pourriez constater qu'elles sont différentes d'une heure en raison du fait que les deux systèmes d'exploitation / systèmes de fichiers traitent différemment l'heure d'été.
Steve Jessop le
Une dernière suggestion: je n'ai pas de machine Windows donc je ne suis pas familier avec les capacités de PuTTY et WinSCP, mais souvent les outils de transfert de fichiers ont des options qui vous permettent de contrôler si l'heure modifiée est préservée ou non. Vos heures de mod sont évidemment préservées, mais si vous pouvez désactiver cette option, lorsque les fichiers sont copiés sur votre système, ils utiliseront les heures de mod définies par l'horloge de votre système, et non par l'horloge du système distant.
MadScientist

Réponses:

206

Ce message indique généralement que certains de vos fichiers ont des heures de modification postérieures à l'heure système actuelle. Depuis makedécide quels fichiers compiler lors de l' exécution d' une génération incrémentielle en vérifiant si un fichier source a récemment été modifiée que son fichier objet, cette situation peut causer des fichiers inutiles à construire, ou pire, les fichiers nécessaires pour ne pas être construit.

Cependant, si vous construisez à partir de zéro (ne faites pas de construction incrémentielle), vous pouvez probablement ignorer cet avertissement sans conséquence.

Tyler McHenry
la source
4
Il semble que le cluster a un temps ~ 3 minutes derrière mon bureau, donc les fichiers ayant été modifiés dans le «futur» semblent une cause probable. Le pari le plus sûr est-il alors d'attendre environ 5 minutes après avoir téléchargé quelque chose avant d'exécuter une compilation? Je préfère ne pas avoir à attendre, alors existe-t-il un moyen de réinitialiser les heures sur les fichiers "futurs" téléchargés pour éviter le problème?
DMA57361
14
@ DMA57361: touch *mettra à jour les mtimes à l'heure actuelle. Alternativement, vous pouvez activer NTP sur votre bureau pour synchroniser votre horloge (en supposant que c'est votre bureau qui ne va pas, et non la machine de l'Uni ... si cette dernière, demandez peut-être aux administrateurs système de le réparer?)
caf
2
Merci pour cela, touch *c'est pour le moment, et je vais voir si je peux trouver ce qui ne va pas et peut-être avoir un mot avec l'administrateur la prochaine fois que je serai sur place.
DMA57361
1
Je avais besoin d' une touche récursive dans mon cas:find . -exec touch {} \;
Ams
8
@AaronS pour des commandes comme touchcelle-ci peuvent accepter plusieurs fichiers sur lesquels agir, vous pouvez le faire (beaucoup) plus efficacement avec find . -exec touch {} +qui invoquera touchavec autant d'arguments que possible.
Viktor Dahl
56

Cela se produit généralement lors de la création dans un répertoire monté NFS et les horloges du client et du serveur NFS ne sont pas synchronisées.

La solution consiste à exécuter un client NTP à la fois sur le serveur NFS et sur tous les clients.

Janneb
la source
1
Je ne construis sur aucun répertoire monté NFS.
kingsmasher1
Laissez-moi savoir si vous pouvez donner quelques conseils pour supprimer un tel avertissement, car cela ne fait vraiment aucune différence dans l'exécution ou les résultats.
kingsmasher1
@ kingsmasher1: Exécutez un client NTP sur toutes les machines impliquées.
janneb
Je viens de vérifier ma cible. La date n'est pas fixée. Je ne sais pas comment exécuter NTP ici. Est-ce que ça va si je mets à jour la date? Mon x86 où je construis est défini sur la date actuelle, mais ma cible (où j'exécute) a une date de soem 1970.
kingsmasher1
1
Le problème est réglé. J'ai changé ma date cible à la date actuelle et l'avertissement a disparu. Le problème est donc le suivant: si la date cible est une date antérieure à la date de l'exécutable, le problème se produit.
kingsmasher1
22

Installez le protocole de temps réseau

Cela m'est également arrivé lors de l'exécution makesur un partage Samba SMB CIFS sur un serveur. Une solution durable consiste à installer le ntpdémon à la fois sur le serveur et sur le client. (Veuillez noter que ce problème n'est pas résolu en exécutant ntpdate. Cela ne résoudrait le décalage horaire que temporairement, mais pas à l'avenir.)

Pour les systèmes dérivés d'Ubuntu et de Debian, tapez simplement la ligne suivante sur la ligne de commande:

$ sudo apt install ntp

De plus, il faudra toujours émettre la commande touch *une fois (et une seule fois) dans le répertoire concerné pour corriger une fois pour toutes les heures de modification des fichiers.

$ touch *

Pour plus d'informations sur les différences entre ntpet ntpdate, veuillez consulter:

Serge Stroobandt
la source
6

Selon l' utilisateur m9dhatter sur LinuxQuestions.org :

"make" utilise l'horodatage du fichier pour déterminer si le fichier qu'il essaie de compiler est ancien ou nouveau. si votre horloge est bonked, il peut avoir des problèmes de compilation.

si vous essayez de modifier des fichiers sur une autre machine avec une heure d'avance de quelques minutes et de les transférer sur votre machine, puis essayez de le compiler, cela peut générer un avertissement indiquant que le fichier a été modifié à partir du futur. l'horloge peut être biaisée ou quelque chose à cet effet (je ne me souviens pas vraiment). vous pouvez simplement lire le fichier incriminé et faire ceci:

#touch <nom du fichier incriminé>

z -
la source
6

Les autres réponses ici expliquent bien le problème, je ne vais donc pas le répéter ici. Mais il existe une solution qui peut le résoudre qui n'est pas encore répertoriée: exécutez simplement make clean, puis réexécutez make.

Avoir make remove des fichiers déjà compilés empêchera make d'avoir des fichiers pour comparer les horodatages, résolvant l'avertissement.

skrrgwasme
la source
ce n'est pas une vraie solution: si le compilateur a besoin de 30 min pour tout compiler et que je travaille sur un seul fichier (où la construction a besoin de 2 sec seulement), je vais perdre toute la journée à faire des modifications sur une seule partie d'un immense bibliothèque. Droite? Cependant oui, avec make cleanvous résoudrez les problèmes (en en créant d'autres).
Leos313
@ Leos313 Je partage simplement ce qui a fonctionné pour moi. Je l'ai rencontré sur un réseau scolaire sur lequel je n'avais pas les autorisations root, donc je ne pouvais pas configurer NTP, et je ne faisais pas confiance aux résultats de la compilation de l'utilisation touchde tous les fichiers. Vous avez raison de dire que cela nécessitera une recompilation complète, mais si cela en vaut la peine ou non, cela dépendra de vos priorités et de la taille de votre projet. Je ne pense pas qu'il soit exact de dire que ce n'est «pas une vraie solution» simplement parce que ce n'est pas la meilleure ou qu'elle présente des inconvénients. Cela résoudra le problème; me semble être une solution.
skrrgwasme
Je n'ai pas voté contre :) cela résout le problème en en créant d'autres. Rien de plus que ça! :) à coup sûr, la réponse aidera dans la plupart des situations et cela vaut la peine d'être ici! Ce que je veux souligner et, parfois, il vaut mieux rester avec l'avertissement que de courirmake clean
Leos313
4

J'ai eu cela dans le passé - en raison des horloges sur les machines. Pensez à configurer NTP pour que toutes les machines aient la même heure.

Ed Heal
la source
2

Ceci est généralement simplement dû à des temps de non-concordance entre vos machines hôte et client. Vous pouvez essayer de synchroniser les heures sur vos machines en utilisant ntp .

Soo Wei Tan
la source
1

La solution est d'exécuter un client NTP, exécutez simplement la commande comme ci-dessous

#ntpdate 172.16.12.100

172.16.12.100 est le serveur ntp

Surjit
la source
2
Bienvenue dans Stack Overflow! Merci pour votre message! Veuillez ne pas utiliser de signatures / slogans dans vos messages. Votre boîte utilisateur compte comme votre signature et vous pouvez utiliser votre profil pour publier toute information vous concernant que vous aimez. FAQ sur les signatures / slogans
Andrew Barber
L'utilisation ntpdaten'est qu'une correction ponctuelle. Il est préférable d'installer ntpà la fois sur le serveur et sur le client pour obtenir une solution durable.
Serge Stroobandt
1

Remplacez la pile de la montre dans votre ordinateur. J'ai vu ce message d'erreur lorsque la pile à l'aspect pièce de monnaie sur la carte mère avait besoin d'être remplacée.

BlushONine
la source
1

(Juste au cas où quelqu'un atterrirait ici) Si vous avez des droits sudo, une option est de synchroniser l'heure du système

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

Vérifiez si le résultat de la compilation, par exemple somefile.o, est plus ancien que la source, par exemple somefile.c. L'avertissement ci-dessus signifie que quelque chose concernant les horodatages des fichiers est étrange. Probablement les horloges système du serveur de l'Université diffèrent de votre horloge et vous poussez par exemple à 13 heures un fichier avec la date de modification 14 heures. Vous pouvez voir l'heure sur la console en tapant la date.

fschmitt
la source
-3

Cela m'est arrivé. C'est parce que j'ai couru make -j 4et que certains travaux se sont terminés dans le désordre. Cet avertissement doit être attendu lors de l'utilisation de l' -joption.

kilojoules
la source
5
Les travaux ne sont pas en ordre. Cela ne veut pas dire que leur heure de modification devrait être dans le futur.
klimkin
@klimkin Pourquoi pas? Je pense que certains processeurs ont fini de construire des composants avant que d'autres processeurs ne commencent.
kilojoules