`rm -rf 'ไม่ใช่อะตอมใช่ไหม


11

ฉันเพิ่งพบข้อผิดพลาดที่สับสน:

rm: cannot remove `xxx/app/cache/prod': Directory not empty

ซึ่งเกิดจากคำสั่งต่อไปนี้:

rm -rf $cache_dir/*

โดย$cache_dirนิยามว่าเป็นxxx/app/cache

ดังนั้นฉันเห็นเช่น: rmลบทุกอย่างในcache/proddir จากนั้นก่อนที่จะพยายามลบcache/prodไดเรกทอรี - โปรแกรมอื่นสร้างไฟล์ / ไดเรกทอรีภายในมันจึงทำให้เกิดrmความล้มเหลว

สมมติฐานของฉันถูกต้องหรือไม่


7
สมมติฐานของคุณถูกต้อง - rm -rไม่ใช่อะตอม หากคุณต้องการให้แน่ใจว่าไม่มีไฟล์ที่ถูกสร้างขึ้นในไดเรกทอรีในขณะที่rm -rfกำลังทำงานอยู่คุณสามารถเปลี่ยนชื่อได้ก่อนจากนั้นจึงลบไดเรกทอรีที่เปลี่ยนชื่อ
จอห์นนี่

@ Johnny: ใช่นั่นคือสิ่งที่ฉันได้ดำเนินการจริงแล้ว :-)
zerkms

แม้ว่าจะไม่ปลอดภัยอย่างสมบูรณ์ หากแอปนั้นกำลังทำงานอยู่ในไดเรกทอรีนั้นมันก็จะไปอยู่กับการย้ายและทำงานได้ตามปกติ
Patrick

สิ่งนี้ไม่เกี่ยวข้องกับการทำrm -rfเธรดให้ปลอดภัย: ถ้าคุณเรียกใช้หลายครั้งพร้อมกันในไดเรกทอรีเดียวกันไดเรกทอรีจะถูกลบ นี่rm -rไม่เกี่ยวกับอะตอม
Gilles 'หยุดชั่วร้าย'

@Gilles: มันขึ้นอยู่กับ: "ส่วนหนึ่งของรหัสคือ thread-safe ถ้ามันจัดการกับโครงสร้างข้อมูลที่ใช้ร่วมกันในลักษณะที่รับประกันการดำเนินการที่ปลอดภัยโดยหลายเธรดในเวลาเดียวกัน" ดังนั้นหากเราถือว่า "เธรด" เป็นการrmเรียกใช้เราอาจพูดถึงความปลอดภัยของเธรด แต่อย่างไรก็ตามมันไม่เปลี่ยนแปลงอะไรเลย
zerkms

คำตอบ:


7

เกิดข้อผิดพลาดได้รับคือ "ไดเรกทอรีไม่ว่าง" ( ENOTEMPTY) ได้รับนี้สมมติฐานของคุณเสียงถูกต้องว่ามันเป็นสภาพการแข่งขันที่โปรแกรมสร้างไฟล์ในไดเรกทอรีที่เพียงแค่ก่อนที่จะrmพยายามที่จะลบไดเรกทอรีให้คาดว่าจะได้ข้อผิดพลาดจากพื้นฐานENOTEMPTYrmdir(2)

หมายเหตุ:เพื่อให้ปลอดภัยคุณสามารถย้าย / เปลี่ยนชื่อไดเรกทอรีเป็นชื่อใหม่แล้วทำการลบไดเรกทอรีนี้


2
คำตอบนี้ไม่ถูกต้องคุณสามารถลบรายการไดเรกทอรีแม้ในขณะที่มีการใช้ไฟล์แล้วลบไดเรกทอรี การทดสอบง่ายๆmkdir x; cat > x/a &; tail -f x/a &; rm -r xแสดงให้เห็นว่าไดเรกทอรีสามารถลบออกได้แม้ในขณะที่ใช้ไฟล์อยู่ไม่ว่าพวกเขาจะเปิดอ่านหรือเขียนก็ตาม
wingedsubmariner

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

1
นอกจากนี้โปรดระวังอย่าสร้างความสับสนให้กับไฟล์ ตัวอธิบายไฟล์จะไม่ถูกลบ แต่ปิดเท่านั้น
wingedsubmariner

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

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