Compilando C ++ em uma máquina Linux remota - aviso "clock skew detected"


168

Estou conectado ao pequeno cluster Linux da minha universidade via PuTTY e WinSCP, transferindo arquivos usando o último e compilando e executando-os com o primeiro. Até agora, meu trabalho foi realizado nos laboratórios da universidade, mas hoje trabalho em casa, gerando um aviso interessante.

Carreguei uma pasta inteira de coisas e, ao executar o makecomando, recebo isso como a última linha de saída:

make: warning: Inclinação do relógio detectada. Sua compilação pode estar incompleta.

O binário resultante funciona corretamente e não parece haver outros erros inesperados no processo de compilação.

Parece que sou capaz de desencadear o erro criando após o upload de alguns arquivos novos / de substituição (edito tudo localmente e depois carrego a nova versão), por isso estou me perguntando se é algo tão simples quanto os tempos de modificação de arquivos incompatíveis? Ou algo mais preocupante?

Então, eu deveria estar preocupado? Como faço para corrigir / impedir isso?


As diferenças de relógio são uma possibilidade, conforme mencionado em algumas das respostas. Você também pode comparar os tempos de modificação dos arquivos de origem antes e depois da cópia - você pode achar que eles são uma hora diferentes devido aos dois sistemas operacionais / sistemas de arquivos que tratam o horário de verão de maneira diferente.
Steve Jessop

Uma última sugestão: não tenho máquinas Windows, por isso não estou familiarizado com os recursos do PuTTY e do WinSCP, mas muitas vezes as ferramentas de transferência de arquivos têm opções que permitem controlar se a hora modificada é preservada ou não. Seus tempos de modificação são obviamente preservados, mas se você puder desativá-los, quando os arquivos forem copiados para o seu sistema, eles usarão os tempos de modificação definidos pelo relógio do sistema, não pelo relógio do sistema remoto.
MadScientist 02/08/2012

Respostas:


206

Essa mensagem geralmente indica que alguns de seus arquivos têm tempos de modificação posteriores ao horário atual do sistema. Como makedecide quais arquivos compilar ao executar uma construção incremental, verificando se um arquivo de origem foi modificado mais recentemente que o arquivo de objeto, essa situação pode causar a criação de arquivos desnecessários ou, pior ainda, os arquivos necessários a não serem criados.

No entanto, se você estiver construindo a partir do zero (não fazendo uma construção incremental), provavelmente poderá ignorar esse aviso sem conseqüências.


4
Parece que o cluster tem um tempo de ~ 3 minutos atrás da minha área de trabalho; portanto, os arquivos modificados no "futuro" parecem uma causa provável. A aposta mais segura é esperar mais ou menos 5 minutos depois de fazer o upload de algo antes de executar uma compilação? Eu prefiro não ter que esperar, então existe alguma maneira de redefinir os horários dos arquivos "futuros" enviados para evitar o problema?
DMA57361

14
@ DMA57361: touch *atualizará os horários para o horário atual. Como alternativa, você pode ativar o NTP na área de trabalho para sincronizar o relógio (assumindo que a área de trabalho está errada e não a máquina da Uni ... se esta for a última, talvez peça aos administradores do sistema para corrigi-lo?)
caf

2
Obrigado por isso, touch *é por enquanto e vou ver se consigo descobrir o que está errado e talvez ter uma palavra com o administrador na próxima vez que estiver no site.
DMA57361 30/09/10

1
Eu precisava de um toque recursivo no meu caso:find . -exec touch {} \;
ams

8
O @AaronS para comandos como touchesse pode aceitar vários arquivos para atuar, você pode fazê-lo (muito) de forma mais eficiente com a find . -exec touch {} +qual invocará o touchmaior número possível de argumentos.
Viktor Dahl

56

Normalmente, isso ocorre ao criar um diretório montado no NFS, e os relógios no cliente e no servidor NFS estão fora de sincronia.

A solução é executar um cliente NTP no servidor NFS e em todos os clientes.


1
Não estou desenvolvendo nenhum dir montado no NFS.
precisa saber é o seguinte

Deixe-me saber se você pode dar algumas dicas para suprimir esse aviso, pois ele realmente não faz diferença na execução ou nos resultados.
precisa saber é o seguinte

@ kingsmasher1: Execute um cliente NTP em todas as máquinas envolvidas.
janneb 28/09/11

Acabei de verificar meu alvo. A data não está marcada. Não sei como executar o NTP aqui. Tudo bem, se eu atualizar a data? Meu x86 onde construo está definido para a data atual, mas meu destino (onde executo) tem uma data de aproximadamente 1970.
kingsmasher1

1
O problema está resolvido. Alterei minha data prevista para a data atual e o aviso desapareceu. Portanto, o problema é: Se a data prevista for uma data anterior à data executável, o problema ocorre.
precisa saber é o seguinte

22

Instale o protocolo de tempo de rede

Isso também aconteceu comigo ao executar makeem um compartilhamento Samba SMB CIFS em um servidor. Uma solução durável consiste em instalar o ntpdaemon no servidor e no cliente. (Observe que esse problema não é resolvido executando ntpdate. Isso resolveria a diferença de horário apenas temporariamente, mas não no futuro.)

Para sistemas derivados do Ubuntu e Debian, basta digitar a seguinte linha na linha de comando:

$ sudo apt install ntp

Além disso, ainda será necessário emitir o comando touch *uma vez (e apenas uma vez) no diretório afetado para corrigir os tempos de modificação do arquivo de uma vez por todas.

$ touch *

Para mais informações sobre as diferenças entre ntpe ntpdate, consulte:



6

De acordo com o usuário m9dhatter no LinuxQuestions.org :

"make" usa o registro de data e hora do arquivo para determinar se o arquivo que está tentando compilar é antigo ou novo. se o relógio estiver cheio, pode haver problemas para compilar.

se você tentar modificar arquivos em outra máquina com um tempo de espera por alguns minutos e transferi-los para sua máquina e tentar compilá-lo, poderá emitir um aviso informando que o arquivo foi modificado no futuro. o relógio pode estar inclinado ou algo parecido com esse efeito (não consigo lembrar de verdade). você poderia apenas ls no arquivo incorreto e fazer o seguinte:

#touch <nome do arquivo do arquivo incorreto>


6

As outras respostas aqui explicam bem o problema, por isso não repetirei aqui. Mas há uma solução que pode resolvê-lo que ainda não está listada: simplesmente execute make cleane execute novamente make.

Ter make remove todos os arquivos compilados impedirá que o make tenha arquivos para comparar os carimbos de data e hora, resolvendo o aviso.


isso não é uma solução real: se o compilador precisar de 30 minutos para compilar tudo e eu estiver trabalhando em um único arquivo (onde a compilação precisa apenas de 2 segundos), vou desperdiçar o dia todo para fazer modificações em uma única parte de um biblioteca enorme. Certo? No entanto, sim, make cleanvocê resolverá os problemas (criando outros).
precisa saber é o seguinte

@ Leos313 Estou apenas compartilhando o que funcionou para mim. Eu o encontrei em uma rede escolar na qual não tinha permissões de root, então não consegui configurar o NTP e não confiei nos resultados da compilação usando apenas touchtodos os arquivos. Você está certo de que exigirá uma recompilação completa, mas se vale ou não a pena o tempo irá variar dependendo de suas prioridades e tamanho do projeto. Não acho correto dizer que "não é uma solução real" apenas porque não é a melhor ou tem algumas desvantagens. Isso resolverá o problema; parece uma solução para mim.
Skrrgwasme

Eu não votei :), resolve o problema criando outros. Nada além disso! :) com certeza a resposta ajudará na maior parte da situação e vale a pena estar aqui! O que quero sublinhar e, às vezes, é melhor ficar com o aviso de corrermake clean
Leos313

4

Eu tive isso no passado - devido aos relógios estarem nas máquinas. Considere configurar o NTP para que todas as máquinas tenham o mesmo tempo.


2

Isso geralmente ocorre devido a tempos de incompatibilidade entre as máquinas host e cliente. Você pode tentar sincronizar os horários em suas máquinas usando o ntp .


1

A solução é executar um cliente NTP, basta executar o comando abaixo

#ntpdate 172.16.12.100

172.16.12.100 é o servidor ntp


2
Bem-vindo ao Stack Overflow! Obrigado pelo seu post! Por favor, não use assinaturas / slogans em suas postagens. Sua caixa de usuário conta como sua assinatura e você pode usar seu perfil para postar qualquer informação sobre você. Perguntas frequentes sobre assinaturas / slogans
Andrew Barber

O uso ntpdateé apenas uma correção pontual. É melhor instalar ntpno servidor e no cliente para obter uma solução durável.
Serge Stroobandt

1

Substitua a bateria do relógio no seu computador. Eu vi essa mensagem de erro quando a bateria que estava procurando moeda na placa-mãe estava precisando ser substituída.


1

(Caso alguém chegue aqui) Se você possui direitos de sudo, uma opção é sincronizar a hora do sistema

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

-1

Verifique se o resultado da compilação, por exemplo, somefile.o, é mais antigo que a fonte, por exemplo, somefile.c. O aviso acima significa que algo nos timestaps dos arquivos é estranho. Provavelmente, os relógios do sistema do servidor da universidade diferem do seu relógio e, por exemplo, você envia às 13:00 um arquivo com data de modificação 14:00. Você pode ver a hora no console digitando data.


-3

Isso aconteceu comigo. É porque eu corri make -j 4e alguns trabalhos terminaram fora de ordem. Este aviso deve ser esperado ao usar a -jopção


5
Os trabalhos concluídos fora de ordem estão ok. Não significa que o tempo de modificação deva ser no futuro.
Klimkin

@klimkin Por que não? Eu acho que alguns processadores terminaram de construir componentes antes de outros processadores iniciarem.
kilojoules
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.