क्या `rm -rf` परमाणु नहीं है?


11

मैंने अभी एक भ्रामक त्रुटि पकड़ी है:

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

जो निम्न आदेश के कारण था:

rm -rf $cache_dir/*

जहां $cache_dirके रूप में परिभाषित किया गया हैxxx/app/cache

इसलिए मैं इसे देखता हूं: dir rmमें सब कुछ हटा दिया cache/prod, फिर cache/prodनिर्देशिका को हटाने का प्रयास करने से ठीक पहले - एक अन्य कार्यक्रम ने इसके अंदर एक फ़ाइल / एक निर्देशिका बनाई जिससे यह rmविफलता का कारण बना ।

क्या मेरी धारणा सही है?


7
आपकी धारणा सही है - rm -rपरमाणु नहीं है। यदि आप यह सुनिश्चित करना चाहते हैं कि rm -rfदौड़ने के दौरान निर्देशिका में कोई और फाइल न बने , तो आप इसे पहले नाम बदल सकते हैं, फिर नाम बदलने वाली निर्देशिका को हटा सकते हैं।
जॉनी

@ जॉनी: हाँ, यह है कि मैं वास्तव में पहले से ही लागू किया है :-)
झटके

हालांकि यह भी पूरी तरह से सुरक्षित नहीं है। यदि कोई ऐप वर्तमान में उस डायरेक्टरी से बाहर चल रहा है, तो यह केवल कदम के साथ जाएगा और सामान्य रूप से काम करता रहेगा।
पैट्रिक

यह rm -rfथ्रेड सुरक्षित होने से कोई लेना-देना नहीं है : यदि आप इसे एक ही निर्देशिका में कई बार समवर्ती रूप से चलाते हैं, तो निर्देशिका हटा दी जाती है। यह rm -rपरमाणु नहीं होने के बारे में है ।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: यह निर्भर करता है: "कोड का एक टुकड़ा थ्रेड-सुरक्षित है अगर यह केवल साझा डेटा संरचनाओं को इस तरीके से जोड़-तोड़ करता है जो एक ही समय में कई थ्रेड्स द्वारा सुरक्षित निष्पादन की गारंटी देता है"। इसलिए यदि हम "धागे" को एक rmआह्वान के रूप में मानते हैं , तो हम धागा-सुरक्षा के बारे में बोल सकते हैं। लेकिन वैसे भी, यह कुछ भी नहीं बदलता है
zerkms

जवाबों:


7

त्रुटि दिया संदेश "निर्देशिका खाली नहीं" (था ENOTEMPTY), यह आपके धारणा ध्वनियों को सही दिया, कि यह एक रेस स्थिति जहां एक प्रोग्राम है जो निर्देशिका बस से पहले में एक फ़ाइल बनाया rmनिर्देशिका को निकालने की कोशिश की, उम्मीद दे रही है ENOTEMPTYअंतर्निहित से त्रुटि rmdir(2)

नोट: सुरक्षित पक्ष पर होने के लिए आप निर्देशिका को एक नए नाम पर ले जा सकते हैं / नाम बदल सकते हैं, और फिर इस निर्देशिका को हटा सकते हैं।


2
यह उत्तर गलत है, आप किसी फ़ाइल के उपयोग में होने पर भी निर्देशिका प्रविष्टियों को हटा सकते हैं, और फिर निर्देशिका को हटा सकते हैं। एक सरल परीक्षण से mkdir x; cat > x/a &; tail -f x/a &; rm -r xपता चलता है कि फ़ाइलों के उपयोग में होने पर भी एक निर्देशिका को हटाया जा सकता है, भले ही वे पढ़ने या लिखने के लिए खुले हों।
विंगडसुबमरिन

1
हां, फाइलें अभी भी मौजूद हैं, लेकिन इससे कोई लेना-देना नहीं है कि निर्देशिका को हटाने में सफलता क्यों नहीं मिली। आपके उत्तर में यह कथन विशेष रूप से गलत है: "सिस्टम उस निर्देशिका को नहीं हटाएगा जिसमें उसमें रहने वाली फाइलें हैं जिन्हें रीड / ओपन मोड में खोला गया है"। आपके उत्तर में कुछ अच्छा सामान है, यह सिर्फ सवाल से संबंधित नहीं है :)
विंगड्सबम्बर 3

1
इसके अलावा, सावधान रहें कि फाइल के साथ फाइल डिस्क्रिप्टर को भ्रमित न करें। फ़ाइल डिस्क्रिप्टर कभी डिलीट नहीं होते, केवल बंद होते हैं।
विंगडसुम्ब्रेनर

1
आपके पहले पैराग्राफ को कुछ काम की भी आवश्यकता हो सकती है। आप फ़ाइल डिलीट नहीं होने के बारे में सही हैं जब फाइलें अभी भी खुली हैं, यह सिर्फ इतना है कि एक बार फाइल को उस डायरेक्टरी से अनलिंक कर देने के बाद वे डायरेक्ट्री को डिलीट होने से नहीं रोकते हैं। हां, इसका मतलब है कि UNIX उन फ़ाइलों को मौजूद करने की अनुमति देता है जो किसी भी डायरेक्टरी में नहीं हैं, जितनी अजीब पहले हैं।
विंगडसुम्ब्रेनर

1
मैं वास्तव में केवल दो कारणों के बारे में सोच सकता हूं कि क्यों विलोपन विफल हो जाएगा, या तो ओपी का अंतर्ज्ञान सही था और एक नई फ़ाइल बनाई गई थी, या यह एक अनुमति त्रुटि है। rmअनुमति त्रुटियों के बारे में शिकायत करता है, इसलिए मुझे लगता है कि हम इसे समाप्त कर सकते हैं। मैं हालांकि एक उत्तर पोस्ट करने के लिए पर्याप्त आश्वस्त नहीं हूं।
विंगडसुम्ब्रेनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.