Компіляція C ++ на віддаленій машині Linux - попередження "виявлено перекос годинника"


168

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

Я завантажив цілу папку речей і, виконуючи makeкоманду, я отримую це як останній рядок виводу:

make: попередження: виявлено перекос годинника. Можливо, ваша збірка неповна.

Отриманий двійковий файл працює правильно, і, здається, не виникає ніяких інших несподіваних помилок у процесі збирання.

Здається, я можу викликати помилку, будуючи після завантаження нових файлів / заміни (я редагую все локально, потім завантажую нову версію), тому мені цікаво, чи це щось таке ж просто, як і невідповідні часи модифікації файлів? Або щось більше стосується?

Отже, я повинен хвилюватися? Як це виправити / запобігти?


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

Остання пропозиція: у мене немає Windows-машин, тому я не знайомий з можливостями PuTTY та WinSCP, але часто інструменти для передачі файлів мають параметри, які дозволяють контролювати, чи зберігається модифікований час чи ні. Ваші модні часи, очевидно, збереглися, але якщо ви можете вимкнути це, тоді, коли файли будуть скопійовані у вашу систему, вони використовуватимуть модні часи, встановлені вашим системним годинником, а не віддаленими системними годинами.
MadScientist

Відповіді:


206

Це повідомлення, як правило, вказує на те, що деякі ваші файли мають час модифікації пізніше поточного системного часу. Оскільки makeвирішує, які файли потрібно компілювати під час інкрементальної збірки, перевіряючи, чи файли вихідних файлів були змінені останнім часом, ніж його об'єктний файл, така ситуація може спричинити побудову непотрібних файлів або, що ще гірше, необхідні файли не будувати.

Однак, якщо ви будуєте з нуля (не роблячи поступової збірки), ви, швидше за все, можете ігнорувати це попередження без наслідків.


4
Здається, у кластера за моїм робочим столом є час ~ 3 хвилини , тому файли, які були змінені в майбутньому, здаються ймовірною причиною. Це найбезпечніша ставка, щоб зачекати 5 хвилин або близько того після завантаження чого-небудь перед запуском збірки? Я б краще не чекав, тож чи є спосіб змінити час будь-яких завантажених "майбутніх" файлів, щоб уникнути проблеми?
DMA57361

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

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 на всіх задіяних машинах.
janneb

Я щойно перевірив свою ціль. Дата не встановлена. Я не впевнений, як тут запустити NTP. Чи добре, якщо я оновлю дату? Мій x86, де я будую, встановлений на поточну дату, але моя ціль (де я виконую) має дату 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" використовує часову марку файлу, щоб визначити, чи файл, який він намагається скласти, старий чи новий. якщо ваш годинник заблокований, у нього можуть виникнути проблеми зі збиранням.

якщо ви спробуєте змінити файли на іншій машині з часом вперед на кілька хвилин і перенести їх на свою машину, а потім спробувати скласти, це може зняти попередження, яке говорить про те, що файл було змінено з майбутнього. Годинник може бути перекошений або щось подібне (не можу дійсно пам'ятати). ви можете просто ls до файлу, який ображає, і зробити це:

#touch <ім'я ображеного файла>


6

Інші відповіді тут непогано пояснюють проблему, тому я не повторюю це тут. Але є одне рішення, яке може вирішити його, яке ще не вказано: просто запустіть make cleanі повторіть make.

Здійснивши видалення всіх уже складених файлів, запобігання наявності файлів для порівняння часових міток, вирішення попередження.


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

@ Leos313 Я просто ділюсь тим, що працювало на мене. Я зіткнувся з цим у шкільній мережі, що у мене не було кореневих дозволів, тому я не міг налаштувати NTP, і я не довіряв результатам компіляції просто використання touchвсіх файлів. Ви маєте рацію, що для цього знадобиться повна перекомпіляція, але чи варто це витрачати час, залежатиме від ваших пріоритетів та розміру проекту. Я не думаю, що це точно сказати, що це "не реальне рішення" лише тому, що це не найкраще або має деякі недоліки. Це вирішить проблему; звучить як рішення для мене.
skrrgwasme

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

4

У мене це було в минулому - через те, що годинники стояли на машинах. Подумайте про налаштування NTP так, щоб усі машини мали однаковий час.


2

Зазвичай це просто через невідповідність часу між вашим хостом і клієнтськими машинами. Ви можете спробувати синхронізувати час на ваших машинах за допомогою ntp .


1

Рішення полягає у запуску клієнта NTP, просто запустіть команду, як показано нижче

#ntpdate 172.16.12.100

172.16.12.100 - сервер ntp


2
Ласкаво просимо до переповнення стека! Дякуємо за ваш пост! Будь ласка, не використовуйте підписи / мітки у своїх публікаціях. Ваше поле користувача вважається вашим підписом, і ви можете використовувати свій профіль, щоб розміщувати будь-яку інформацію про себе, яка вам подобається. FAQ про підписи / теги
Ендрю Барбер

Використання ntpdate- це лише одноразова корекція. Краще встановити ntpі сервер, і клієнт, щоб отримати довговічне рішення.
Серж Стротобандт

1

Замініть акумулятор годинника на комп’ютері. Я бачив це повідомлення про помилку, коли акумулятор на монеті на материнській платі потребував заміни.


1

(Про всяк випадок, коли хтось тут приземлиться) Якщо у вас є права судо, одним із варіантів є синхронізація системного часу

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 файл з датою модифікації 2:00. Ви можете побачити час на консолі, ввівши дату.


-3

Це сталося зі мною. Це тому, що я бігав make -j 4і деякі роботи закінчувались. Це попередження слід очікувати при використанні -jопції.


5
Роботи закінчуються не в порядку. Це не означає, що час їх модифікації повинен бути у майбутньому.
klimkin

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