Compilación de C ++ en una máquina Linux remota: advertencia de "sesgo de reloj detectado"

168

Estoy conectado al pequeño clúster de Linux de mi universidad a través de PuTTY y WinSCP, transfiriendo archivos usando este último y compilándolos y ejecutándolos con el primero. Mi trabajo hasta el momento se ha realizado en los laboratorios de la universidad, pero hoy he estado haciendo un trabajo en casa que generó una advertencia interesante.

Subí una carpeta completa de cosas y, al ejecutar el makecomando, obtengo esto como la última línea de salida:

make: advertencia: reloj sesgo detectado. Su construcción puede estar incompleta.

El binario resultante funciona correctamente y no parece haber ningún otro error inesperado en el proceso de compilación.

Parece que puedo activar el error construyendo después de cargar algunos archivos nuevos / de reemplazo (edito todo localmente y luego subo la nueva versión), así que me pregunto si es algo tan simple como los tiempos de modificación de archivos no coincidentes. ¿O algo más preocupante?

Entonces, ¿debería estar preocupado? ¿Cómo soluciono / evito esto?

DMA57361
fuente
Las diferencias de reloj son una posibilidad, como se menciona en algunas de las respuestas. También puede comparar los tiempos de modificación de los archivos de origen antes y después de la copia; es posible que descubran que son una hora diferentes debido a que los dos sistemas operativos / sistemas de archivos tratan el horario de verano de manera diferente.
Steve Jessop
Una última sugerencia: no tengo ninguna máquina con Windows, así que no estoy familiarizado con las capacidades de PuTTY y WinSCP, pero a menudo las herramientas de transferencia de archivos tienen opciones que le permiten controlar si el tiempo modificado se conserva o no. Obviamente, sus tiempos de modificación se conservan, pero si puede desactivarlo, cuando los archivos se copien en su sistema, utilizarán los tiempos de modificación establecidos por el reloj del sistema, no por el reloj del sistema remoto.
MadScientist

Respuestas:

206

Ese mensaje suele indicar que algunos de sus archivos tienen tiempos de modificación posteriores a la hora actual del sistema. Dado makeque decide qué archivos compilar al realizar una compilación incremental verificando si los archivos fuente se han modificado más recientemente que su archivo objeto, esta situación puede hacer que se compilen archivos innecesarios o, peor aún, que no se compilen los archivos necesarios .

Sin embargo, si está construyendo desde cero (no está haciendo una construcción incremental), es probable que pueda ignorar esta advertencia sin consecuencias.

Tyler McHenry
fuente
44
Parece que el clúster tiene un tiempo de ~ 3 minutos detrás de mi escritorio, por lo que los archivos que se han modificado en el "futuro" parece una causa probable. ¿Es la apuesta más segura esperar 5 minutos más o menos después de cargar algo antes de ejecutar una compilación? Prefiero no tener que esperar, ¿hay alguna forma de restablecer los tiempos en los archivos "futuros" cargados para evitar el problema?
DMA57361
14
@ DMA57361: touch *actualizará los mtimes a la hora actual. Alternativamente, puede habilitar NTP en su escritorio para sincronizar su reloj (suponiendo que es su escritorio lo que está mal, y no la máquina de Uni ... si es esto último, ¿tal vez les pida a los administradores de sistemas que lo arreglen?)
caf
2
Gracias por eso, touch *es por ahora, y veré si puedo averiguar cuál está mal y quizás hablar con el administrador la próxima vez que esté en el sitio.
DMA57361
1
Necesitaba un toque recursivo en mi caso:find . -exec touch {} \;
enms
8
@AaronS para comandos como touchese puede aceptar múltiples archivos para actuar, puede hacerlo (mucho) de manera más eficiente con find . -exec touch {} +lo que invocará touchcon tantos argumentos como sea posible.
Viktor Dahl el
56

Por lo general, esto ocurre cuando se construye en un directorio montado en NFS, y los relojes del cliente y el servidor NFS no están sincronizados.

La solución es ejecutar un cliente NTP tanto en el servidor NFS como en todos los clientes.

janneb
fuente
1
No estoy construyendo sobre ningún directorio montado en NFS.
kingsmasher1
Hágame saber si puede dar algunos consejos para suprimir dicha advertencia, ya que realmente no hace ninguna diferencia en la ejecución o los resultados.
kingsmasher1
@ kingsmasher1: ejecute un cliente NTP en todas las máquinas involucradas.
janneb
Acabo de comprobar mi objetivo. La fecha no está establecida. No estoy seguro de cómo ejecutar NTP aquí. ¿Está bien si actualizo la fecha? Mi x86 donde construyo está configurado en la fecha actual, pero mi objetivo (donde ejecuto) tiene una fecha de 1970.
kingsmasher1
1
El problema está resuelto. Cambié mi fecha objetivo a la fecha actual y la advertencia desapareció. Entonces el problema es: si la fecha objetivo es una fecha posterior a la fecha ejecutable, el problema ocurre.
kingsmasher1
22

Instalar el protocolo de tiempo de red

Esto también me sucedió cuando se ejecuta makeen un recurso compartido Samba SMB CIFS en un servidor. Una solución duradera consiste en instalar el ntpdemonio tanto en el servidor como en el cliente. (Tenga en cuenta que este problema no se resuelve ejecutando ntpdate. Esto resolvería la diferencia horaria solo temporalmente, pero no en el futuro).

Para los sistemas derivados de Ubuntu y Debian, simplemente escriba la siguiente línea en la línea de comando:

$ sudo apt install ntp

Además, aún será necesario emitir el comando touch *una vez (y solo una vez) en el directorio afectado para corregir los tiempos de modificación del archivo de una vez por todas.

$ touch *

Para obtener más información sobre las diferencias entre ntpy ntpdate, consulte:

Serge Stroobandt
fuente
6

Según el usuario m9dhatter en LinuxQuestions.org :

"make" usa la marca de tiempo del archivo para determinar si el archivo que intenta compilar es antiguo o nuevo. Si su reloj está dañado, puede tener problemas para compilar.

si intenta modificar los archivos en otra máquina con un tiempo de reloj de adelanto de unos minutos y transferirlos a su máquina y luego intenta compilarlo, puede emitir una advertencia que dice que el archivo se modificó en el futuro. el reloj puede estar sesgado o algo por el estilo (realmente no puedo recordar). podrías simplemente ir al archivo ofensivo y hacer esto:

#touch <nombre de archivo del archivo ofensivo>

z -
fuente
6

Las otras respuestas aquí hacen un buen trabajo al explicar el problema, por lo que no repetiré eso aquí. Pero hay una solución que puede resolverlo que aún no aparece en la lista: simplemente ejecute make clean, luego vuelva a ejecutar make.

Hacer que remove elimine los archivos ya compilados evitará que make tenga archivos para comparar las marcas de tiempo, resolviendo la advertencia.

skrrgwasme
fuente
esta no es una solución real: si el compilador necesita 30 minutos para compilar todo y estoy trabajando en un solo archivo (donde la compilación necesita solo 2 segundos), desperdiciaré todo el día para realizar modificaciones en una sola parte de un Gran biblioteca. ¿Correcto? Sin embargo, sí, con make cleanusted resolverá los problemas (creando otros).
Leos313
@ Leos313 Solo estoy compartiendo lo que funcionó para mí. Lo encontré en una red escolar en la que no tenía permisos de root, por lo que no pude configurar NTP, y no confiaba en los resultados de la compilación de solo usar touchen todos los archivos. Tiene razón en que requerirá una compilación completa, pero si vale la pena o no el tiempo variará dependiendo de sus prioridades y el tamaño del proyecto. No creo que sea exacto decir que "no es una solución real" simplemente porque no es la mejor o tiene algunos inconvenientes. Solucionará el problema; Suena como una solución para mí.
skrrgwasme
No voté en contra :) resuelve el problema creando otros. ¡Nada más que esto! :) seguro que la respuesta ayudará en la mayoría de las situaciones y vale la pena estar aquí. Lo que quiero subrayar y, a veces, es mejor permanecer con la advertencia que ejecutarmake clean
Leos313
4

He tenido esto en el pasado, debido a que los relojes estaban en las máquinas. Considere configurar NTP para que todas las máquinas tengan el mismo tiempo.

Ed Heal
fuente
2

Esto generalmente se debe simplemente a tiempos de discrepancia entre sus máquinas host y cliente. Puede intentar sincronizar las horas en sus máquinas usando ntp .

Soo Wei Tan
fuente
1

La solución es ejecutar un cliente NTP, solo ejecute el comando de la siguiente manera

#ntpdate 172.16.12.100

172.16.12.100 es el servidor ntp

Surjit
fuente
2
¡Bienvenido a Stack Overflow! Gracias por tu publicación! No utilices firmas / lemas en tus publicaciones. Su carpeta de usuario cuenta como su firma, y ​​puede usar su perfil para publicar cualquier información sobre usted que desee. Preguntas frecuentes sobre firmas / lemas
Andrew Barber
Usar ntpdatees solo una corrección única. Es mejor instalarlo ntptanto en el servidor como en el cliente para obtener una solución duradera.
Serge Stroobandt
1

Reemplace la batería del reloj en su computadora. He visto este mensaje de error cuando la batería que buscaba monedas en la placa base necesitaba ser reemplazada.

BlushONine
fuente
1

(Por si acaso alguien aterriza aquí) Si tiene derechos de sudo, una opción es sincronizar la hora del sistema

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

Haga comprobaciones si el resultado de la compilación, por ejemplo, somefile.o, es anterior a la fuente, por ejemplo, somefile.c. La advertencia anterior significa que algo sobre las marcas de tiempo de los archivos es extraño. Probablemente los relojes del sistema del servidor de la Universidad difieran de su reloj y, por ejemplo, presione a la 1 p.m. un archivo con fecha de modificación a las 2 p.m. Puede ver la hora en la consola escribiendo la fecha.

fschmitt
fuente
-3

Esto me paso a mi. Es porque corrí make -j 4y algunos trabajos terminaron fuera de servicio. Se debe esperar esta advertencia al usar la -jopción.

kilojulios
fuente
55
Los trabajos terminados fuera de servicio están bien. No significa que su tiempo de modificación deba ser en el futuro.
klimkin
@klimkin ¿Por qué no? Creo que algunos procesadores terminaron de construir componentes antes de que otros procesadores comenzaran.
kilojulios