खुली हुई फ़ाइलों से डिस्क स्थान खाली करने का सबसे अच्छा तरीका है


28

नमस्ते, मेरे पास कई फाइलें हैं जिन्हें हटा दिया गया है लेकिन किसी कारण से हटाए गए फ़ाइलों से जुड़ा डिस्क स्थान तब तक उपयोग करने में असमर्थ है जब तक मैं डिस्क स्थान लेने वाली फ़ाइल के लिए स्पष्ट रूप से प्रक्रिया को मार नहीं देता।

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

उपरोक्त हटाए गए फ़ाइल द्वारा लिया गया डिस्क स्थान समस्याओं का कारण बनता है जैसे कि त्रुटि को प्राप्त करने के लिए एक फ़ाइल पथ को स्वत: पूर्ण करने के लिए टैब कुंजी का उपयोग करने का प्रयास करते समय bash: cannot create temp file for here-document: No space left on device

लेकिन जब मैं kill -9 1623उस पीआईडी ​​के लिए जगह खाली करता हूं, तब मुझे मुक्त कर दिया जाता है और मुझे अब कोई त्रुटि नहीं मिलती है।

मेरे प्रश्न हैं:

  • जब फ़ाइल पहले हटा दी जाती है तो इस स्थान को तुरंत मुक्त क्यों नहीं किया जाता है?
  • हटाई गई फ़ाइलों से संबंधित फ़ाइल स्थान को वापस पाने का सबसे अच्छा तरीका क्या है?

और कृपया मुझे इस स्थिति के बारे में किसी भी गलत शब्दावली का उपयोग करें जिसे मैंने इस्तेमाल किया है या किसी अन्य प्रासंगिक और प्रासंगिक जानकारी को बताया है।

जवाबों:


26

यूनियनों पर, फ़ाइलनाम सिर्फ पॉइंटर्स (इनोडेस) होते हैं, जो उस मेमोरी की ओर इशारा करते हैं, जहां फाइल रहती है (जो हार्ड ड्राइव या रैम-समर्थित फाइल सिस्टम हो सकती है)। प्रत्येक फ़ाइल लिंक की संख्या को दर्ज करती है: लिंक या तो फ़ाइल नाम (बहुवचन हो सकते हैं, यदि एक ही फ़ाइल के कई हार्ड लिंक हैं), और हर बार फ़ाइल खोलने पर भी, प्रक्रिया वास्तव में "लिंक" रखती है। वही स्थान।

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

तो, जवाब है, जबकि प्रक्रियाओं में अभी भी फाइलें खुली हैं, आपको अंतरिक्ष वापस पाने की उम्मीद नहीं करनी चाहिए । इसे मुक्त नहीं किया गया है, इसका सक्रिय रूप से उपयोग किया जा रहा है। यह भी एक कारण है कि अनुप्रयोगों को वास्तव में फाइलों को बंद कर देना चाहिए जब वे उनका उपयोग करना समाप्त करते हैं। सामान्य उपयोग में, आपको उस स्थान को मुफ्त में नहीं सोचना चाहिए, और यह भी बिल्कुल सामान्य नहीं होना चाहिए - अस्थायी फ़ाइलों के अपवाद के साथ जो उद्देश्य पर अनलिंक किए गए हैं, वास्तव में ऐसी कोई भी फाइल नहीं होनी चाहिए जिसे आप चाहते हैं अप्रयुक्त माना जा रहा है, लेकिन अभी भी खुला है। यदि कोई ऐसी प्रक्रिया है जो यह बहुत कुछ करती है और इस पर विचार करें कि आप इसका उपयोग कैसे करते हैं, या बस अधिक स्थान पाते हैं, तो समीक्षा करने का प्रयास करें।


24

फाइलें फाइल सिस्टम से हटाई जाती हैं, जहां इस इनोडेशन का कोई भी संदर्भ हटा दिया जाता है। संदर्भ डिस्क (किसी भी निर्देशिका में लिंक), और खुले अनुप्रयोगों से हो सकता है। यदि आप फ़ाइल निकालते हैं - आप केवल डिस्क से संदर्भ हटाते हैं, लेकिन - आवेदन से अभी भी संदर्भ है।

आप फिर दो तरीकों से "मुक्त" स्थान प्राप्त कर सकते हैं:

  1. जैसा कि ऊपर उल्लेख किया गया है - आप एप्लिकेशन को मार सकते हैं, जो फ़ाइल खोलें।
  2. आप कर सकते हैं ... फ़ाइल काटें। हटाए जाने पर भी:

यदि आप पीआईडी ​​जानते हैं - इस पीआईडी ​​द्वारा कौन सी फाइलें खुली हैं: ls -l / proc / PID / fd जिसे आप यहां देख रहे हैं जैसे लिंक:

अपरिभाषित @ uml: ~ $ ls -l / proc / 18596 / fd
राजम ०
lrwx ------ 1 अपरिभाषित अपरिभाषित 64 लुट 1 00:06 0 -> / देव / पीडी / 30
lrwx ------ 1 अपरिभाषित अपरिभाषित 64 लुट 1 00:06 1 -> / देव / पीडी / 30
lrwx ------ 1 अपरिभाषित अपरिभाषित 64 लुट 1 00:05 2 -> / देव / पीडी / 30
lr-x ------ 1 अपरिभाषित अपरिभाषित 64 lut 1 00:06 3 -> / घर / अपरिभाषित / x (हटाए गए)
lr-x ------ 1 अपरिभाषित अपरिभाषित 64 lut 1 00:06 4 -> anon_inode: inotify

जैसा कि आप देखते हैं - 3 एफडी हटा दिया गया है। आप इसे कमांड द्वारा काट सकते हैं (उदाहरण के लिए):

अपरिभाषित @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ यूएमएल: ~ $ 

याद रखें कि यदि आवेदन इस फ़ाइल से पढ़ा जाता है - यह उनके लिए खतरनाक हो सकता है। लेकिन - अगर यह केवल एक लॉग फ़ाइल है - तो आप इसे सुरक्षित रूप से काट सकते हैं।


ध्यान दें कि फ़ाइल को काट-छाँट करने के बाद , इसे धारण करने वाली मूल प्रक्रिया अभी भी अंत तक जा सकती है (जहाँ यह अंत की उम्मीद करती है)। परिणाम प्रतीत होता है बहुत बड़ा है लेकिन विरल फाइलें जो डिस्क पर कम जगह लेती हैं (यदि फ़ाइल सिस्टम विरल फ़ाइलों का समर्थन करता है) और वे अभी भी बढ़ते रहते हैं!
törzsmókus

हाँ। यदि कोई फाइल करने के लिए लिखता है, तो यह डिस्क पर जगह लेगा। यह मुश्किल है कि इसे रोकने के बिना आवेदन जो डिस्क पर लिखें;)
अपरिभाषित

8

जैसा कि दूसरों ने कहा है कि lsofउन सभी हटाई गई फ़ाइलों को सूचीबद्ध करने के लिए उपयोग किया जा सकता है जो अभी भी खुले फ़ाइल डिस्क्रिप्टर के कारण डिस्क पर हैं। हालाँकि, यह एक बहुत लंबी सूची हो सकती है। यहाँ एक कमांड है जो बाइट्स में आरोही आकार द्वारा छांटी गई इन फाइलों को सूचीबद्ध करता है:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

ऐसा करने का एक और अधिक सफल तरीका हो सकता है लेकिन उपरोक्त आदेश मेरे लिए काम करता है।


5

अंतरिक्ष को तुरंत मुक्त नहीं किया गया है क्योंकि चल रही प्रक्रिया में अभी भी हटाए गए फ़ाइल के लिए एक खुली फ़ाइल हैंडल है। आखिरकार, अगर एक प्रक्रिया अभी भी एक फ़ाइल का उपयोग करने की कोशिश कर रही है, तो आप वास्तव में नहीं चाहते हैं कि कर्नेल इसे (फ़ाइल) से छुटकारा पा ले। यह प्रक्रिया को थोड़ा परेशान कर सकती है। अंतरिक्ष को मुक्त करने का सबसे अच्छा (और केवल, अब तक मुझे पता है) तरीका वही है जो आपने किया था - प्रक्रिया को मार डालो।


संभवतः "सिर्फ यह कैसे काम करता है" की तुलना में एक बेहतर वाक्य है "अगर एक प्रक्रिया अभी भी एक फ़ाइल का उपयोग कर रही है तो यूनिक्स को इससे छुटकारा पाने की कोशिश नहीं करनी चाहिए।"
ब्राचली

अच्छी बात। मैंने उसे उत्तर में जोड़ दिया है।
जॉन

-1

(मिंट 17.1)

टी एल; डॉ:

  • sudo baobab(डिस्क उपयोग विश्लेषक) के साथ निरीक्षण करें ।
  • rootउपयोगकर्ता का कचरा साफ़ करें।

प्रसंग

लगातार फाइल डिलीट करते समय मैं कभी घटती जगह के साथ फंसता गया। मैंने trash-cliकचरा खाली करने के लिए पैकेज स्थापित किया , लेकिन इससे कोई फायदा नहीं हुआ। अंत में, मैंने देखा कि जब मैं baobab(जीयूआई में डिस्क उपयोग विश्लेषक, कम से कम मिंट 17.1 पर) डिस्क स्थान संरचना का निरीक्षण करने के लिए चला गया, तो यह चेतावनी दी कि कुछ फ़ोल्डर्स सुलभ नहीं थे। इसलिए मैंने इसे rootउपयोग के रूप में चलाया sudo baobab। इससे समस्या का पता चला। डिलीट की गई बहुत सारी फाइलें rootमेरे ही यूजर की नहीं बल्कि यूजर के ट्रैशबिन में थीं । इस प्रकार, मैं अंतरिक्ष को मुक्त नहीं कर सका। फिर मैंने बस रूट ( sudo trash-cli) के रूप में उपयोग करके कचरा खाली कर दिया और मेरी सभी जगह वापस आ गई।


-1

नीचे दिए गए आदेश का उपयोग करके देखें

lsof | grep deleted

और फिर हटाए गए फ़ाइल के पीआईडी ​​को मारें।


ओपी को वह दूर मिल गया; यह उनके सवालों का जवाब नहीं है।
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.