“ cp” จัดการกับไฟล์ที่เปิดอย่างไร


15

ฉันมีสองไดเรกทอรีแยกกัน ผู้ใช้โหลดไฟล์ลงในไฟล์แรก มี cronjob ทำงานในพื้นหลังซึ่งคัดลอกไฟล์ทุก ๆ 5 นาทีไปยังไดเรกทอรีที่สอง

จะเกิดอะไรขึ้นหากผู้ใช้ไม่ได้อัปโหลดไฟล์และ cronjob คัดลอกไฟล์? โปรดทราบว่าทั้งสองไดเรกทอรีเป็นเจ้าของโดยผู้ใช้ที่แตกต่างกัน cronjob จะดำเนินการในฐานะที่เป็นราก


โปรดอ่านโพสต์นี้เพื่อดูว่าเกิดอะไรขึ้นในกรณีเช่นนี้: unix.stackexchange.com/questions/49299/…
Serge

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

ไม่cpจะไม่รอจนกว่าไฟล์จะถูกอัพโหลดอย่างสมบูรณ์ ตามที่เราคาดหวังว่าอัตราการถ่ายโอนข้อมูลเครือข่ายต่ำกว่าเพียงแค่คัดลอกไฟล์จากที่หนึ่งไปยังอีกที่หนึ่งภายในโฮสต์เดียวกันจากนั้นในบางจุดcpจะถึงจุดสิ้นสุดไฟล์ปัจจุบันและจะหยุดคัดลอก วิธีแก้ปัญหาของคุณอาจทำได้โดยง่าย: ก่อนอื่นผู้ใช้อัปโหลดไฟล์ที่มีชื่อไฟล์บางอันที่พิเศษ (ตัวอย่างเช่นการเติมด้วย.(ตัวอักษรจุด) เมื่อการถ่ายโอนเสร็จสิ้นผู้ใช้จะเปลี่ยนชื่อเป็นชื่อเดิมจากนั้นงาน cron สำหรับไฟล์ที่ไม่ได้เริ่มต้นด้วย..
เสิร์จ

คำตอบ:


17

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


ขอบคุณนั่นคือสิ่งที่ฉันอยากรู้! มีวิธีง่าย ๆ ในการหลีกเลี่ยงปัญหานี้หรือไม่? ฉันตรวจสอบหน้า man cp แต่ไม่พบการใช้งาน
Stuffy

ทำอะไรกันแน่? หากต้องการคัดลอกไฟล์ทั้งหมดยกเว้นไฟล์ที่เปิดอยู่? ฉันไม่คิดว่าจะมีวิธีง่ายๆในการทำเช่นนี้ (นอกเหนือจาก writin สคริปต์ของคุณเองที่ใช้fuser+ cpสำเนาดังกล่าวจะไม่น่าเชื่อถือมากจริง ๆ มันจะไม่คัดลอกไฟล์ใด ๆ ที่เปิดในโปรแกรมแก้ไขข้อความตัวอย่าง
Krzysztof Adamski

@Stuff บางทีใน cronjob ของคุณคุณสามารถแสดงรายการไฟล์ที่เปิดด้วยlsof? ผลลัพธ์ของสิ่งนั้นมีไว้เพื่อให้ง่ายต่อการประมวลผล คุณสามารถกรองไฟล์ที่กำลังเปิดอยู่ (พูดโดยเป็นตัวอย่างcp) สำหรับการเขียน
Wojtek Rzepala

@ WojtekRzepala ฉันจะดูนี่ขอบคุณ บางทีฉันอาจจะเขียนบทเล็ก ๆ ที่ cronjob ดำเนินการ
Stuffy

@Stuff: โปรดจำไว้ว่ามันอาจจะไม่น่าเชื่อถือจริงๆถ้ามันไม่ได้ทำงานโดยผู้ใช้รูท (ปัญหาเดียวกันคือfuserแน่นอน) เพราะเครื่องมือนี้อาจไม่แสดงไฟล์ทั้งหมด
Krzysztof Adamski

7

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

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

ดังนั้นจัดให้งานอัปโหลดของคุณย้ายไฟล์ไปยังไดเรกทอรีอื่นเมื่อเสร็จสิ้นการอัปโหลด ชี้งาน cron ที่ไดเรกทอรีที่แตกต่างกันนี้


6

ดูเหมือนว่าคุณต้องการที่จะทำงาน dir ซิงค์

เพราะ-u, - ปรับปรุงตัวเลือกของcp

คัดลอกเฉพาะเมื่อไฟล์ SOURCE ใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป

ดังนั้นคุณสามารถเพิ่ม cronjob เช่นcp -auv SOURCEDIR/* DESTDIRซึ่งจะคัดลอกไฟล์เหล่านั้นที่มีการเปลี่ยนแปลงเวลาการเปลี่ยนแปลง ซึ่งหมายความว่าDESTDIRในที่สุดจะได้รับสำเนาที่สมบูรณ์ในขณะที่การอัปโหลดเสร็จสิ้น

rsyncสามารถทำงานเดียวกันได้ เช่นrsync -av SOURCEDIR/ DESTDIR.

แม้ว่าจะมีการใช้ตัวเลือก -a คุณลักษณะบางอย่างที่ระบุไว้ (เช่นความเป็นเจ้าของ) สามารถรักษาได้โดยผู้ใช้ขั้นสูง

ดูman cp, man rsyncสำหรับรายละเอียด


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