คำสั่ง cp ไม่ควรล้มเหลว

ฉันกำลังพยายามเขียนงาน โดยที่ฉันกำลังพยายามสลับไฟล์ระหว่าง ${File} และ ${File}.new

รหัสดั้งเดิมเป็นแบบนี้ -

generate ${File}.new
mv ${File} ${File}.backup
mv ${File}.new ${File}

มันล้มเหลวในบางกรณี เมื่อ mv แรกเสร็จสิ้นในเวลาเดียวกัน แต่ mv ที่สองยังไม่เสร็จสิ้น อาจมีคำขอสำหรับ ${File} และคำขอนั้นถูกปฏิเสธเนื่องจากไฟล์ไม่พร้อมใช้งานในชื่อนั้น เกิดขึ้นไม่บ่อยนักแต่ก็เกิดขึ้น (เกิดขึ้นเมื่อวานนี้เป็นครั้งแรกในรอบ 6 สัปดาห์)

เพื่อหลีกเลี่ยงปัญหาดังกล่าว ฉันคิดว่าจะแทนที่ mv ด้วย cp ดังนั้นฉันจึงพยายามสร้างสิ่งนี้ -

generate ${File}.new
cp ${File} ${File}.backup
cp ${File}.new ${File}

rm ${File}.new

ตอนนี้ ความท้าทายของฉันคือในขณะที่ฉันกำลังเขียนถึง ${File} หากมีกระบวนการอ่านในขณะนั้น การคัดลอกอาจล้มเหลวโดยบอกว่าไม่สามารถล็อควัตถุได้

ความกลัวความล้มเหลวของฉันมีจริงหรือไม่?

ฉันต้องการบอกให้โปรแกรมรอสองสามวินาที/นาทีแล้วลองอีกครั้งแทนที่จะล้มเหลว

ฉันใช้ AIX 6.1 พร้อมด้วย korn เชลล์


person Raghav    schedule 26.09.2012    source แหล่งที่มา


คำตอบ (3)


ดูว่าคุณสามารถทำให้สิ่งนี้ได้ผลสำหรับคุณหรือไม่ ทำให้ "ไฟล์" เป็นลิงก์สัญลักษณ์ไปยังไฟล์อื่นอีกสองไฟล์คือ file1 และ file2 ใช้คำสั่ง "ln -fs file1 file" เพื่อสร้างลิงค์นี้ เมื่อมีคนเปิด "file" ระบบปฏิบัติการจะเปลี่ยนเส้นทางคุณไปที่ "file1" เมื่อคุณต้องการสร้างข้อมูลสำรอง ให้รันคำสั่ง "ln -fs file2 file" และตอนนี้ file จะชี้ไปที่ file2 จากนั้นคุณสามารถทำอะไรก็ได้ที่คุณต้องการทำใน file1 ย้อนกลับกระบวนการเพื่อกลับไปที่ file1

person Rod Meyer    schedule 28.09.2012

คุณสามารถใช้ฮาร์ดลิงก์เพื่อทำส่วนสำรอง:

generate ${File}.new
ln -f ${File} ${File}.backup
mv ${File}.new ${File}

หลังจาก ln จะมีชื่อไฟล์สองชื่อสำหรับไฟล์เก่า หลังจาก mv เฉพาะชื่อไฟล์ .backup เท่านั้นที่จะอ้างอิงถึงไฟล์เก่า ${File} จะอ้างถึงไฟล์ใหม่

person ninjalj    schedule 28.09.2012

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

person Neil    schedule 26.09.2012
comment
ฉันไม่สามารถลบไฟล์ก่อนที่จะเขียนทับได้... ในกรณีนี้ กระบวนการที่ล็อคไฟล์อยู่ในปัจจุบันจะล้มเหลว - person Raghav; 26.09.2012