Компиляция C ++ на удаленной машине с Linux - предупреждение «Обнаружено искажение часов»


168

Я подключен к небольшому кластеру Linux моего университета через PuTTY и WinSCP, передавая файлы с помощью последнего, компилируя и выполняя их с первым. Моя работа до сих пор выполнялась в университетских лабораториях, но сегодня я выполнял некоторую работу дома, которая вызвала интересное предупреждение.

Я загрузил целую папку с вещами и, запустив makeкоманду, получаю следующую строку вывода:

make: warning: Обнаружен перекос часов. Ваша сборка может быть неполной.

Полученный двоичный файл работает правильно, и в процессе сборки не возникает никаких неожиданных ошибок.

Кажется, я могу вызвать ошибку путем сборки после загрузки некоторых новых / замененных файлов (я редактирую все локально, а затем загружаю новую версию), поэтому мне интересно, не так ли просто, как несоответствующие времена модификации файла? Или что-то более важное?

Итак, я должен волноваться? Как я могу это исправить / предотвратить?


Различия часов возможны, как упоминалось в некоторых ответах. Вы также можете сравнить время модификации исходных файлов до и после копирования - вы можете обнаружить, что они отличаются на час, потому что две ОС / файловые системы по-разному относятся к летнему времени.
Стив Джессоп

Последнее предложение: у меня нет машин с Windows, поэтому я не знаком с возможностями PuTTY и WinSCP, но часто в инструментах передачи файлов есть опции, которые позволяют вам контролировать, сохраняется ли измененное время или нет. Время вашего мода, очевидно, сохраняется, но если вы можете отключить его, то при копировании файлов в вашу систему они будут использовать время мода, установленное вашими системными часами, а не часами удаленной системы.
MadScientist

Ответы:


206

Это сообщение обычно указывает на то, что некоторые из ваших файлов имеют время модификации позднее текущего системного времени. Поскольку makeрешает, какие файлы компилировать при выполнении инкрементной сборки, проверяя, были ли исходные файлы изменены позднее, чем его объектный файл, эта ситуация может привести к созданию ненужных файлов или, что еще хуже, к необходимым файлам, которые не будут создаваться.

Однако, если вы строите с нуля (не производите инкрементную сборку), вы, вероятно, можете игнорировать это предупреждение без последствий.


4
Кажется, у кластера есть время ~ 3 минуты за моим рабочим столом, поэтому вероятнее всего причина заключается в файлах, которые были изменены в будущем. Лучше всего подождать 5 минут или около того после загрузки чего-либо перед запуском сборки? Я предпочел бы не ждать, поэтому есть ли способ сбросить время для любых загруженных «будущих» файлов, чтобы избежать проблемы?
DMA57361

14
@ DMA57361: touch *обновит время до текущего времени. В качестве альтернативы вы можете включить NTP на вашем рабочем столе для синхронизации ваших часов (при условии, что это ваш рабочий стол, а не компьютер Uni ... если последний, возможно, попросите сисадминов исправить это?)
caf

2
Спасибо за это, touch *это пока, и я посмотрю, смогу ли я выяснить, что не так, и, возможно, поговорить с парнем из админа в следующий раз, когда я буду на сайте.
DMA57361

1
Мне нужно было рекурсивное прикосновение в моем случае:find . -exec touch {} \;
Ams

8
@AaronS для таких команд touchможет принимать несколько файлов, с которыми можно работать, вы можете сделать это (намного) более эффективно, с помощью find . -exec touch {} +которого будет вызываться touchкак можно больше аргументов.
Виктор Даль

56

Обычно это происходит при сборке в смонтированном каталоге NFS, когда часы на клиенте и сервере NFS не синхронизированы.

Решение состоит в том, чтобы запустить клиент NTP как на сервере NFS, так и на всех клиентах.


1
Я не собираюсь на какой-либо NFS монтируется директории.
kingsmasher1

Дайте мне знать, если вы можете дать несколько советов, чтобы подавить такое предупреждение, поскольку это действительно не имеет никакого значения в исполнении или результатах.
kingsmasher1

@ kingsmasher1: Запустите NTP-клиент на всех задействованных машинах.
Янв

Я только что проверил свою цель. Дата не установлена. Я не уверен, как запустить NTP здесь. Это нормально, если я обновлю дату? Мой x86, где я строю, настроен на текущую дату, но моя цель (где я выполняю) имеет дату soem 1970-х годов.
kingsmasher1

1
Проблема отсортирована. Я изменил свою целевую дату на текущую, и предупреждение исчезло. Итак, проблема в том, что: если целевая дата является датой возврата, а не датой исполнения, проблема возникает.
kingsmasher1

22

Установите сетевой протокол времени

Это также случилось со мной при работе makeна общем ресурсе Samba SMB CIFS на сервере. Надежное решение состоит в установке ntpдемона как на сервере, так и на клиенте. (Обратите внимание, что эта проблема не решается при запуске ntpdate. Это позволит устранить разницу во времени только временно, но не в будущем.)

Для систем на основе Ubuntu и Debian просто введите в командной строке следующую строку:

$ sudo apt install ntp

Кроме того, по-прежнему нужно будет выполнить команду touch *один раз (и только один раз) в уязвимом каталоге, чтобы раз и навсегда исправить время изменения файла.

$ touch *

Для получения дополнительной информации о различиях между ntpи ntpdate, пожалуйста, обратитесь к:



6

По словам пользователя m9dhatter на LinuxQuestions.org :

«make» использует временную метку файла, чтобы определить, является ли файл, который он пытается скомпилировать, старым или новым. если ваши часы сбиты, могут возникнуть проблемы с компиляцией.

Если вы попытаетесь изменить файлы на другом компьютере с опережением времени на несколько минут и перенести их на свой компьютер, а затем попытаться скомпилировать его, может появиться предупреждение о том, что файл был изменен в будущем. часы могут быть искажены или что-то в этом роде (не могу вспомнить). Вы могли бы просто обратиться к файлу-нарушителю и сделать это:

#touch <имя файла-нарушителя>


6

Другие ответы здесь хорошо объясняют проблему, поэтому я не буду повторять это здесь. Но есть одно решение, которое может решить эту проблему, которого пока нет в списке: просто запустите make clean, а затем снова запустите make.

При использовании make удалить все уже скомпилированные файлы не позволит файлам make сравнивать временные метки и разрешать предупреждение.


это ненастоящее решение: если компилятору нужно 30 минут для компиляции всего, а я работаю над одним файлом (где сборке нужно всего 2 секунды), я потрачу впустую весь день, чтобы внести изменения в одну часть огромная библиотека. Правильно? Однако да, с make cleanвами будут решать проблемы (создавая другие).
Leos313

@ Leos313 Я просто делюсь тем, что у меня сработало. Я столкнулся с этим в школьной сети, на которой у меня не было прав доступа root, поэтому я не мог настроить NTP и не доверял результатам компиляции при простом использовании touchвсех файлов. Вы правы, что это потребует полной перекомпиляции, но то, стоит ли это времени, будет зависеть от ваших приоритетов и размера проекта. Я не думаю, что было бы правильно сказать, что это «ненастоящее решение» только потому, что оно не самое лучшее или имеет некоторые недостатки. Это решит проблему; звучит как решение для меня.
skrrgwasme

Я не проголосовал :) это решает проблему путем создания других. Ничего больше, чем это! :) наверняка ответ поможет в большинстве ситуаций, и оно того стоит! Что я хочу подчеркнуть, и, иногда, лучше остаться с предупреждением, чем бегомmake clean
Leos313

4

У меня было это в прошлом - из-за часов на машинах. Рассмотрите возможность настройки NTP, чтобы все машины имели одинаковое время.


2

Обычно это происходит просто из-за несоответствия времени между вашим хостом и клиентскими компьютерами. Вы можете попытаться синхронизировать время на ваших машинах, используя ntp .


1

Решение состоит в том, чтобы запустить клиент NTP, просто запустите команду, как показано ниже

#ntpdate 172.16.12.100

172.16.12.100 это сервер ntp


2
Добро пожаловать в стек переполнения! Спасибо за ваш пост! Пожалуйста, не используйте подписи / слоганы в своих сообщениях. Ваш ящик пользователя считается вашей подписью, и вы можете использовать свой профиль, чтобы публиковать любую информацию о себе, которая вам нравится. Часто задаваемые вопросы о подписи / слоганы
Эндрю Барбер

Использование ntpdateтолько одноразовая коррекция. Лучше установить ntpкак на сервер, так и на клиент, чтобы получить долговременное решение.
Серж Строобандт

1

Замените батарею часов в вашем компьютере. Я видел это сообщение об ошибке, когда нужная батарея на материнской плате нуждалась в замене.


1

(На всякий случай, если кто-нибудь приземлится здесь). Если у вас есть права sudo, один из вариантов - синхронизировать системное время.

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

-1

Сделайте проверку, если результат компиляции, например somefile.o, старше, чем источник, например somefile.c. Вышеприведенное предупреждение означает, что что-то относительно временных интервалов файлов является странным. Возможно, системные часы университетского сервера отличаются от ваших часов, и вы, например, отправляете в 13:00 файл с датой изменения 14:00. Вы можете увидеть время в консоли, набрав дату.


-3

Это случилось со мной. Это потому, что я побежал, make -j 4и некоторые работы закончились не по порядку. Это предупреждение следует ожидать при использовании -jопции.


5
Вакансии закончились в порядке. Не означает, что их время модификации должно быть в будущем.
Климкин

@klimkin Почему бы и нет? Я думаю, что некоторые процессоры закончили сборку компонентов раньше, чем другие процессоры.
килоджоулей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.