การคอมไพล์ C ++ บนเครื่อง Linux ระยะไกล - คำเตือน“ ตรวจพบการเอียงนาฬิกา”


168

ฉันเชื่อมต่อกับคลัสเตอร์ Linux ขนาดเล็กของมหาวิทยาลัยของฉันผ่าน PuTTY และ WinSCP ถ่ายโอนไฟล์โดยใช้อันหลังและรวบรวมและเรียกใช้งานกับกลุ่มเก่า งานของฉันได้รับการดำเนินการแล้วในห้องทดลองของมหาวิทยาลัย แต่วันนี้ฉันทำงานที่บ้านซึ่งสร้างคำเตือนที่น่าสนใจ

ฉันอัพโหลดโฟลเดอร์ทั้งหมดของสิ่งของและเมื่อใช้makeคำสั่งฉันจะได้รับสิ่งนี้เป็นบรรทัดสุดท้ายของผลลัพธ์:

ทำให้: คำเตือน: ตรวจพบนาฬิกาเอียง งานสร้างของคุณอาจไม่สมบูรณ์

ไบนารีที่ได้นั้นทำงานได้อย่างถูกต้องและดูเหมือนจะไม่มีข้อผิดพลาดที่ไม่คาดคิดอื่น ๆ ในกระบวนการสร้าง

ฉันดูเหมือนจะสามารถทริกเกอร์ข้อผิดพลาดได้โดยการสร้างหลังจากอัปโหลดไฟล์ใหม่ / ไฟล์ทดแทน (ฉันแก้ไขทุกอย่างในเครื่องจากนั้นอัปโหลดเวอร์ชันใหม่) ดังนั้นฉันสงสัยว่ามันเป็นเรื่องง่ายเหมือนการแก้ไขไฟล์ที่ไม่ตรงกันหรือไม่ หรือมีอะไรเกี่ยวข้องมากกว่านี้?

ดังนั้นฉันควรกังวล ฉันจะแก้ไข / ป้องกันได้อย่างไร


ความแตกต่างของนาฬิกาเป็นไปได้ที่กล่าวถึงในคำตอบบางส่วน คุณยังสามารถเปรียบเทียบเวลาการแก้ไขของไฟล์ต้นฉบับก่อนและหลังการคัดลอก - คุณอาจพบว่าไฟล์ต่างกันหนึ่งชั่วโมงเนื่องจากระบบปฏิบัติการ / ระบบไฟล์สองระบบที่มีการประหยัดเวลากลางวันแตกต่างกัน
Steve Jessop

หนึ่งคำแนะนำสุดท้าย: ฉันไม่มีเครื่อง Windows ดังนั้นฉันจึงไม่คุ้นเคยกับความสามารถของ PuTTY และ WinSCP แต่บ่อยครั้งที่เครื่องมือการถ่ายโอนไฟล์มีตัวเลือกที่ช่วยให้คุณควบคุมว่าเวลาที่แก้ไขจะถูกเก็บไว้หรือไม่ เวลาในการปรับแต่งของคุณจะถูกเก็บรักษาไว้อย่างชัดเจน แต่ถ้าคุณสามารถปิดการทำงานนั้นเมื่อไฟล์ถูกคัดลอกไปยังระบบของคุณพวกเขาจะใช้เวลาในการปรับตั้งที่นาฬิการะบบของคุณไม่ใช่นาฬิการะบบระยะไกล
MadScientist

คำตอบ:


206

ข้อความนั้นมักจะเป็นตัวบ่งชี้ว่าไฟล์บางไฟล์ของคุณมีการแก้ไขในเวลาต่อมามากกว่าเวลาระบบปัจจุบัน ตั้งแต่makeตัดสินใจไฟล์ที่รวบรวมเมื่อดำเนินการสร้างที่เพิ่มขึ้นโดยการตรวจสอบหากมีไฟล์ที่มาได้รับการแก้ไขเมื่อเร็ว ๆ นี้กว่าไฟล์วัตถุสถานการณ์เช่นนี้อาจทำให้เกิดไฟล์ที่ไม่จำเป็นที่จะสร้างขึ้นหรือเลว, ไฟล์ที่จำเป็นที่จะไม่ถูกสร้างขึ้น

อย่างไรก็ตามหากคุณกำลังสร้างตั้งแต่เริ่มต้น (ไม่ได้สร้างส่วนเพิ่ม) คุณอาจเพิกเฉยต่อคำเตือนนี้ได้


4
ดูเหมือนว่าคลัสเตอร์มีเวลา ~ 3 นาทีที่ด้านหลังเดสก์ท็อปของฉันดังนั้นไฟล์ที่ถูกแก้ไขใน "อนาคต" น่าจะเป็นสาเหตุ การเดิมพันที่ปลอดภัยที่สุดคือการรอ 5 นาทีหลังจากอัปโหลดอะไรก่อนที่จะสร้างบิลด์ ฉันไม่ต้องรออีกต่อไปจึงมีวิธีรีเซ็ตเวลาในไฟล์ "อนาคต" ที่อัปโหลดเพื่อหลีกเลี่ยงปัญหานี้หรือไม่
DMA57361

14
@ DMA57361: touch *จะอัปเดต mtimes เป็นเวลาปัจจุบัน หรือคุณสามารถเปิดใช้งาน NTP บนเดสก์ทอปของคุณซิงค์นาฬิกาของคุณ (สมมติว่ามันเป็นเดสก์ทอปของคุณที่ไม่ถูกต้องและไม่ได้เครื่อง Uni ของ ... หากเป็นอย่างหลังอาจจะถาม sysadmins ในการแก้ไขปัญหาได้หรือไม่)
คาเฟ่

2
ขอบคุณสำหรับtouch *ตอนนี้และฉันจะดูว่าฉันสามารถหาคำตอบที่ผิดและอาจมีคำพูดกับผู้ดูแลระบบในครั้งต่อไปที่ฉันอยู่ในไซต์
DMA57361

1
ผมจำเป็นต้องมีการสัมผัส recursive ในกรณีของฉัน:find . -exec touch {} \;
AMS

8
@AaronS สำหรับคำสั่งเช่นนี้touchที่สามารถยอมรับไฟล์หลายไฟล์เพื่อดำเนินการต่อคุณสามารถทำได้อย่างมีประสิทธิภาพมากขึ้นfind . -exec touch {} +ซึ่งจะเรียกใช้touchอาร์กิวเมนต์ที่มีมากที่สุดเท่าที่จะเป็นไปได้
Viktor Dahl

56

โดยทั่วไปสิ่งนี้จะเกิดขึ้นเมื่อสร้างในไดเร็กทอรีที่เมาท์ NFS และนาฬิกาบนไคลเอนต์และเซิร์ฟเวอร์ NFS จะไม่ซิงค์กัน

ทางออกคือการเรียกใช้ไคลเอนต์ NTP บนทั้งเซิร์ฟเวอร์ NFS และไคลเอนต์ทั้งหมด


1
ฉันไม่ได้กำลังสร้างบน dir ที่ติดตั้ง NFS
kingsmasher1

เรารู้ว่าคุณสามารถให้คำแนะนำเพื่อระงับคำเตือนดังกล่าวได้หรือไม่เพราะมันไม่ได้สร้างความแตกต่างในการดำเนินการหรือผลลัพธ์
kingsmasher1

@ kingsmasher1: เรียกใช้ไคลเอนต์ NTP บนเครื่องทั้งหมดที่เกี่ยวข้อง
janneb

ฉันเพิ่งตรวจสอบเป้าหมายของฉัน ไม่ได้ตั้งวันที่ ฉันไม่แน่ใจว่าจะใช้ NTP ได้อย่างไร ไม่เป็นไรถ้าฉันอัพเดทวันที่? x86 ของฉันที่ฉันสร้างถูกตั้งค่าเป็นวันที่ปัจจุบัน แต่เป้าหมายของฉัน (ที่ฉันเรียกใช้) มีวันที่ของปี 1970
kingsmasher1

1
ปัญหาจะถูกจัดเรียง ฉันเปลี่ยนวันที่เป้าหมายเป็นวันที่ปัจจุบันและคำเตือนหายไป ดังนั้นปัญหาคือ: หากวันที่เป้าหมายคือวันที่ย้อนหลังกว่าวันที่ปฏิบัติการปัญหาจะเกิดขึ้น
kingsmasher1

22

ติดตั้งโปรโตคอลเวลาเครือข่าย

สิ่งนี้เกิดขึ้นกับฉันเช่นกันเมื่อใช้งานmakeSamba SMB CIFS ที่แบ่งปันบนเซิร์ฟเวอร์ โซลูชันที่ทนทานประกอบด้วยการติดตั้งntpdaemon บนเซิร์ฟเวอร์และไคลเอ็นต์ (โปรดทราบว่าปัญหานี้ไม่ได้รับการแก้ไขโดยการทำงานntpdateซึ่งจะแก้ไขความแตกต่างของเวลาเพียงชั่วคราว แต่ไม่ใช่ในอนาคต)

สำหรับระบบที่ได้รับจาก Ubuntu และ Debian เพียงพิมพ์บรรทัดต่อไปนี้ที่บรรทัดคำสั่ง:

$ sudo apt install ntp

ยิ่งไปกว่านั้นหนึ่งจะยังคงต้องออกคำสั่งtouch *ครั้งเดียว (และเพียงครั้งเดียว) ในไดเรกทอรีที่ได้รับผลกระทบเพื่อแก้ไขเวลาการแก้ไขไฟล์ครั้งเดียวและทั้งหมด

$ touch *

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างntpและntpdateโปรดดูที่:



6

ตามที่ผู้ใช้ m9dhatter บน LinuxQuestions.org :

"make" ใช้การประทับเวลาของไฟล์เพื่อพิจารณาว่าไฟล์ที่พยายามรวบรวมนั้นเก่าหรือใหม่ หากนาฬิกาของคุณถูกทำให้อับอายมันอาจมีปัญหาในการรวบรวม

หากคุณพยายามแก้ไขไฟล์ที่เครื่องอื่นโดยใช้เวลานาฬิกาล่วงหน้าประมาณสองสามนาทีและถ่ายโอนไปยังเครื่องของคุณจากนั้นลองทำการคอมไพล์ไฟล์อาจมีคำเตือนเตือนว่าไฟล์ถูกแก้ไขจากอนาคต นาฬิกาอาจเบ้หรือบางสิ่งบางอย่างเกิดขึ้นได้ (จำไม่ได้จริงๆ) คุณสามารถเพียงแค่ไปที่ไฟล์ที่ละเมิดและทำสิ่งนี้:

#touch <ชื่อไฟล์ของไฟล์ที่ละเมิด>


6

คำตอบอื่น ๆ ที่นี่ทำงานได้ดีในการอธิบายปัญหาดังนั้นฉันจะไม่ทำซ้ำที่นี่ แต่มีหนึ่งวิธีการแก้ปัญหาที่สามารถแก้ไขปัญหาที่ไม่มีอยู่เลย: ทำงานเพียงแค่รันใหม่อีกครั้งแล้วmake cleanmake

การทำให้ไฟล์ที่ถูกคอมไพล์แล้วจะป้องกันไม่ให้มีไฟล์ใด ๆ เพื่อเปรียบเทียบการประทับเวลาของการแก้ไขคำเตือน


นี่ไม่ใช่ทางออกที่แท้จริง: หากคอมไพเลอร์ต้องการ 30 นาทีในการรวบรวมทุกอย่างและฉันกำลังทำงานกับไฟล์เดียว (ที่บิลด์ต้องการเพียง 2 วินาทีเท่านั้น) ฉันจะเสียทั้งวันเพื่อทำการดัดแปลงในส่วนเดียวของ ห้องสมุดขนาดใหญ่ ขวา? อย่างไรก็ตามmake cleanคุณจะแก้ปัญหาได้ด้วยการสร้างคนอื่น
Leos313

@ Leos313 ฉันแค่แบ่งปันสิ่งที่ทำงานให้ฉัน ฉันพบมันในเครือข่ายโรงเรียนที่ฉันไม่ได้รับอนุญาตให้ใช้รากดังนั้นฉันจึงไม่สามารถตั้งค่า NTP ได้และฉันไม่เชื่อถือผลการรวบรวมเพียงแค่ใช้touchกับไฟล์ทั้งหมด คุณถูกต้องที่จะต้องมีการคอมไพล์ใหม่อย่างสมบูรณ์ แต่ไม่ว่าจะคุ้มค่าหรือไม่ก็ตามจะแตกต่างกันไปตามลำดับความสำคัญและขนาดโครงการของคุณ ฉันไม่คิดว่ามันถูกต้องที่จะบอกว่า "ไม่ใช่ทางออกที่แท้จริง" เพียงเพราะมันไม่ได้ดีที่สุดหรือมีข้อเสีย มันจะแก้ไขปัญหา ฟังดูเหมือนทางออกสำหรับฉัน
skrrgwasme

ฉันไม่ได้ลงคะแนน :) มันแก้ปัญหาด้วยการสร้างคนอื่น ไม่มีอะไรมากไปกว่านี้! :) แน่นอนคำตอบจะช่วยได้ในสถานการณ์ส่วนใหญ่และคุ้มค่าที่จะมาที่นี่! สิ่งที่ฉันต้องการขีดเส้นใต้และบางครั้งมันจะดีกว่าที่จะอยู่กับคำเตือนกว่าการทำงานmake clean
Leos313

4

ฉันเคยมีสิ่งนี้ในอดีต - เนื่องจากนาฬิกาถูกวางบนเครื่อง พิจารณาตั้งค่า NTP เพื่อให้เครื่องทั้งหมดมีเวลาเดียวกัน


2

ซึ่งมักเกิดจากช่วงเวลาที่ไม่ตรงกันระหว่างเครื่องโฮสต์และเครื่องไคลเอนต์ของคุณ คุณสามารถพยายามที่จะประสานครั้งบนเครื่องของคุณโดยใช้NTP


1

ทางออกคือการเรียกใช้ไคลเอนต์ NTP เพียงเรียกใช้คำสั่งดังต่อไปนี้

#ntpdate 172.16.12.100

172.16.12.100 เป็นเซิร์ฟเวอร์ ntp


2
ยินดีต้อนรับสู่ Stack Overflow! ขอบคุณสำหรับการโพสต์ของคุณ! กรุณาอย่าใช้ลายเซ็น / แท็กไลน์ในโพสต์ของคุณ กล่องผู้ใช้ของคุณนับเป็นลายเซ็นของคุณและคุณสามารถใช้โปรไฟล์ของคุณเพื่อโพสต์ข้อมูลใด ๆ เกี่ยวกับตัวคุณที่คุณชอบ คำถามที่พบบ่อยเกี่ยวกับลายเซ็น / แท็กไลน์
Andrew Barber

การใช้ntpdateเป็นเพียงการแก้ไขครั้งเดียว เป็นการดีกว่าที่จะติดตั้งntpบนเซิร์ฟเวอร์และไคลเอนต์เพื่อรับโซลูชันที่ทนทาน
Serge Stroobandt

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

@klimkin ทำไมล่ะ ฉันคิดว่าตัวประมวลผลบางตัวสร้างส่วนประกอบเสร็จก่อนที่ตัวประมวลผลอื่นจะเริ่มต้น
kilojoules
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.