จะเกิดอะไรขึ้นหากไฟล์ถูกแก้ไขขณะที่คุณกำลังคัดลอก


19

ผลกระทบของการคัดลอกไฟล์คืออะไร fileA.big (900mb) จากตำแหน่ง B ถึง locationC หากในระหว่างการดำเนินการ cp พูด 35% ผ่านกระบวนการ fileA.big จะถูกผนวกเข้ากับข้อมูลใหม่และขยายจาก 900mb เป็น 930mb

ผลลัพธ์ของการสิ้นสุดการคัดลอก (เช่น fileA.big ที่ locationC) คืออะไร

จะเกิดอะไรขึ้นถ้าการคัดลอกมีค่าประมาณ 70% ถึงและไฟล์ต้นฉบับจะได้รับการอัปเดต แต่เวลานี้ถูกตัดเหลือ 400mb (เช่นความคืบหน้าของการคัดลอกอยู่นอกเหนือจากจุดตัดปลาย) ผลลัพธ์ของการคัดลอกสิ้นสุดคืออะไร

อ้างถึง linux OS บนระบบไฟล์ ext3 / ext4 ไม่มีเวทย์มนตร์ระดับเสียง ฯลฯ เพียงแค่ cp เก่าธรรมดา ความอยากรู้อยากเห็นเกิดจากการคัดลอกไฟล์ couchdb สดสำหรับการสำรองข้อมูล แต่สนใจในสถานการณ์ทั่วไปมากกว่ากรณีการใช้งานเฉพาะ


ขอบคุณที่ถามคำถามนี้ 'ความรู้' ของฉันส่วนใหญ่เป็นการคาดเดา ... จนถึงปัจจุบัน
tshepang

คำตอบ:


10

หากfileA.bigโตขึ้นระหว่างการคัดลอกการคัดลอกจะรวมข้อมูลที่ถูกต่อท้าย

หากไฟล์ถูกตัดทอนให้สั้นกว่าที่คัดลอกอยู่ในขณะนี้สำเนาจะถูกยกเลิกตรงที่ไฟล์ at และไฟล์ปลายทางจะมีสิ่งที่ถูกคัดลอกไปจนถึงเวลาที่ถูกยกเลิก


27

Patrick มีความถูกต้องไม่มากก็น้อย แต่นี่เป็นสาเหตุ วิธีที่คุณคัดลอกไฟล์ภายใต้ UNIX จะทำงานดังนี้:

  1. ลองอ่านบาง (เพิ่มเติม) fileAไบต์จาก
  2. ถ้าเราล้มเหลวในการรับไบต์เนื่องจากเราอยู่ที่ (หรือที่ผ่านมา) จุดสิ้นสุดของไฟล์เราจะเสร็จสิ้น เลิก.
  3. มิฉะนั้นให้เขียนไบต์fileBและวนกลับไปยังขั้นตอนที่ 1

การรู้สิ่งนั้นและการรู้ว่ามันง่ายอย่างนั้นทำให้เราเห็นบางมุม

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

หากไฟล์ถูกตัดทอนโปรแกรมคัดลอกจะบอกว่า "โอ้ฉันผ่านจุดสิ้นสุดไปแล้ว!" และออกจาก

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

(ที่กล่าวว่าฉันไม่คุ้นเคยกับ CouchDB และเป็นไปได้ที่จะออกแบบฐานข้อมูลให้ทนทานต่อการทุจริตประเภทนี้ แต่ที่ดีที่สุดคือต้องแน่ใจอย่างแน่นอน)


คำอธิบายที่ดี BTW นี่ทำให้ฉันประหลาดใจเสมอว่าทำไมมันถึงเป็นไปได้ในระบบปฏิบัติการ UNIX เหมือน OSE โดยไม่ได้รับข้อความแสดงข้อผิดพลาดทั่วไปที่รู้จักจาก Windows ("ไม่สามารถเข้าถึงไฟล์ - ไฟล์ที่ใช้") คุณไม่สามารถเล่นไฟล์ MP3 ที่ถูกลบไปแล้วในขณะที่เล่นมัน ภายใต้ระบบปฏิบัติการ Unix คุณสามารถ (อย่างน่าประหลาดใจ) - โดยไม่มีปัญหาเลย ฉันเดาว่าระบบปฏิบัติการที่ใช้ UNIX จะทำงานกับสำเนาสำรองของไฟล์ได้ตลอดเวลาดังนั้นจึงเป็นไปได้
ไวยากรณ์

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

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