लिनक्स में df फ़ाइल हटाने के बाद सही खाली जगह नहीं दिखा रहा है


143

मेरे पास फ़ाइल सर्वर हैं जो फ़ाइलों को संग्रहीत करने के लिए उपयोग किए जाते हैं। फाइलें एक सप्ताह के लिए या एक साल तक वहां रह सकती हैं। दुर्भाग्य से, जब मैं सर्वर से फ़ाइलों को हटाता हूं, तो dfकमांड मुक्त किए गए स्थान को प्रतिबिंबित नहीं करता है। तो आखिरकार, सर्वर भर जाता है ( df99% दिखाता है), और मेरी स्क्रिप्ट वहां कोई और फाइल नहीं भेजती है, सिवाय इसके कि वहां पर कुछ दर्जन जीबी खाली जगह हो सकती है।

noatimeअगर कोई फर्क पड़ता है तो मुझे माउंटेड पार्टीशन पर झंडा मिला है ।


क्या यह एक विभाजन पर या सभी विभाजन पर हो रहा है?
खालिद

खैर, यह मेरे मुख्य डेटा विभाजन पर हो रहा है, जो केवल एक ही चीज है जिसकी मुझे परवाह है, क्योंकि मैं केवल इस पर फाइलें लिखता हूं / हटाता हूं।

कृपया मुझे समाधान, या एक लिंक के साथ प्रबुद्ध करें।

फाइलसिस्टम क्या है? DF, सुपरब्लॉक की एक प्रतिमा करता है, यह हो सकता है कि आपका फाइल सिस्टम sb इनोड को अपडेट नहीं कर रहा है। क्या आपने कैश फ्लश करने की कोशिश की है?
सेम

Ext4 का उपयोग करना। आप कैश कैसे फ्लश करते हैं?

जवाबों:


235

फ़ाइल नाम हटाने से वास्तव में फ़ाइल को हटाया नहीं जाता है। कुछ अन्य प्रक्रिया फ़ाइल को खुले रखती है, जिससे इसे हटाया नहीं जा सकता है; फ़ाइल को रिलीज़ करने के लिए उस प्रक्रिया को पुनरारंभ करें या मारें।

उपयोग

lsof +L1

यह पता लगाने के लिए कि कौन सी प्रक्रिया एक डिलीट (अनलिंक) फाइल का उपयोग कर रही है।


2
जो फाइलें निकाली जाती हैं, वे एक महीने से अधिक समय तक एक्सेस नहीं की जाती हैं, और उन्हें एक्सेस करने वाली एकमात्र प्रक्रिया nginx है, इसलिए इसका संदेह है।

39
+1। इसके अलावा, "lsof + L1" आपको बताएगा कि कौन सा प्रोग्राम फाइलों को खोल रहा है।
पीहर

4
रूट रन के रूप में "lsof -n | grep फ़ाइल," आपको यह जानकर आश्चर्य होगा कि जो भी प्रक्रियाएं उन्हें किसी कारण से खुली रखने के कारण कितनी लंबी फाइलें चिपक सकती हैं। यदि बाकी सब विफल हो जाता है, तो रिबूट करें, मुझे यह सुझाव देने में बुरा लगता है लेकिन यह निश्चित रूप से सुनिश्चित करेगा कि कुछ भी फाइल पर पकड़ नहीं है। प्रति पीहर, lsof + L1 शायद जाने का बेहतर तरीका है।
स्कॉटजेड

3
आपने मुझे बचा लिया! 93G लॉग फ़ाइल हटा दी गई और उसे वापस स्थान नहीं मिला और वह काम नहीं कर सका। धन्यवाद।
ल्यूक कजिन्स

1
उसी पंक्तियों के साथ और यदि यह दूसरों की मदद करता है, तो मैंने एक बड़ी nginx access.log फ़ाइल को मिटा दिया, लेकिन केवल nginx को पुनरारंभ करने के बाद स्थान को पुनः प्राप्त करने में सक्षम था: सेवा nginx पुनरारंभ
Nick

27

जैसा कि इग्नासियो का उल्लेख है, फ़ाइल को हटाने से अंतरिक्ष खाली नहीं होगा जब तक कि आप उस फ़ाइल के खिलाफ खुले हैंडल वाली प्रक्रियाओं को हटा नहीं देते हैं।

फिर भी, आप प्रक्रियाओं को मारे बिना अंतरिक्ष को पुनः प्राप्त कर सकते हैं। आपको केवल फाइल डिस्क्रिप्टर को हटाने की आवश्यकता है।

पहले निष्पादित lsof | फ़ाइल को रखने की प्रक्रिया की पहचान करने के लिए grep हटा दिया गया

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

फिर निष्पादित करें:

cd /proc/PID/fd

फिर

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

"1" फ़ाइल डिस्क्रिप्टर होगा। अब उस स्पेस को पुनः प्राप्त करने के लिए "> FD" टाइप करें

> 1

यदि फ़ाइल को होल्ड करने वाली अन्य प्रक्रियाएँ हैं, तो आपको ऑपरेशन को दोहराने की आवश्यकता हो सकती है।


1
क्या करता > FDहै?
Pred

यह फाइल डिस्क्रिप्टर
एड्रियन डिकिको

2
क्या इस >आदेश का कोई नाम है? मुझे इसे उपयोग करने में सक्षम होने के लिए zsh से bash में स्विच करना पड़ा। क्या इसे zsh पर चलाना संभव है?
अरीरा

1
यह एक आउटपुट रीडायरेक्ट है और इसलिए फ़ाइल को छोटा करता है। लंबे समय से "इको-एन> 1" या "सच> 1" होगा। यह वास्तव में एफडी को नहीं हटाता है, यह बाद में एक खाली फ़ाइल को इंगित करता है।
Eckes

8

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

यदि यह पता चलता है कि फ़ाइलें कहीं और संदर्भित हैं, तो मुझे लगता है कि आपको इन-नंबर खोजने के लिए ls -i फ़ाइल (ओं) को करना होगा, और फिर -inum <inode-number> के साथ एक खोज करें। उस फाइल के अन्य सन्दर्भ (आप शायद उसी फाइल सिस्टम के भीतर बने रहने के लिए भी उपयोग करना चाहते हैं)।


4

इसे खोलने की प्रक्रिया से फाइल अभी भी लॉक है। स्थान खाली करने के लिए, इन चरणों को करें:

  1. चलाएं sudo lsof | grep deletedऔर देखें कि कौन सी प्रक्रिया फ़ाइल को पकड़े हुए है। उदाहरण परिणाम:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. का उपयोग कर प्रक्रिया को मार डालो sudo kill -9 {PID}। उपरोक्त नमूने में, पीआईडी ​​1623 है।

    $ sudo kill -9 1623
    
  3. dfयह जाँचने के लिए चलाएँ कि क्या पहले से ही जगह खाली है। यदि यह अभी भी भरा हुआ है, तो शायद आपको कुछ सेकंड इंतजार करने और फिर से जांच करने की आवश्यकता है।


4

यदि विभाजन को केवल डिस्क उपयोग के लिए डिस्क स्थान के कुछ हिस्से को आरक्षित करने के लिए कॉन्फ़िगर किया गया है, dfतो इस स्थान को उपलब्ध के रूप में शामिल नहीं किया जाएगा।

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

फ़ाइलों / निर्देशिकाओं को हटाने के बाद भी अंतरिक्ष को पुनः प्राप्त किया जाएगा, गैर-रूट उपयोगकर्ता विशेष विभाजन में लिखने में सक्षम नहीं होगा।

आप आसानी से जांच सकते हैं कि आपके डिवाइस में रूट और गैर-रूट उपयोगकर्ता के रूप में एक फ़ाइल बनाने की कोशिश कर रहा है या नहीं।

इसके अतिरिक्त आप रन करके फाइलसिस्टम विन्यास की जांच कर सकते हैं

tune2fs -l <device> | egrep "Block count|Reserved block count

और अपने दम पर वास्तविक% की गणना।

रूट-ओनली उपयोग के लिए आरक्षित डिस्क% बदलने के लिए, निष्पादित करें

tune2fs -m <percentage> <device>

1

अन्य उत्तर सही हैं: यदि आप किसी फ़ाइल को हटाते हैं, और स्थान मुक्त नहीं होता है, तो यह आमतौर पर या तो होता है क्योंकि फ़ाइल अभी भी खुली रहती है, या इसके लिए अन्य हार्डलिंक हैं।

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

इस तरह, आप जल्दी से दूसरी हार्डलिंक के कारण उन फ़ाइलों को ढूंढ लेंगे जो अभी भी जगह घेरती हैं। यह हटाए गए स्थान को भी दिखाएगा, लेकिन खुली हुई फ़ाइलें (जैसा कि अनुमति से इनकार किया गया है), मुझे विश्वास है, क्योंकि यह फ़ाइल नाम नहीं पढ़ सकता है)।


1

जब से मुझे पता है कि आप में से एक टन redhat /varऔर gzipping फ़ाइलों के लिए कर रहे हैं उम्मीद कर रहा FS FS हटना, लेकिन यह बढ़ता है, बस सुनिश्चित करें कि आप सेवा syslog पुनरारंभ करें। तथा

lsof -v file

यह आपको किसी भी तरह दिखाएगा।


1
यह वास्तव में बहुत कुछ नहीं जोड़ता है; स्वीकृत उत्तर ने 2001 में उसके पीछे के तर्क को कवर किया। जब आपके पास 50 प्रतिनिधि हैं, तो टिप्पणियों का उपयोग करें यदि आप मौजूदा उत्तरों में क्वालीफायर जोड़ना चाहते हैं।
एंड्रयू बी

0

एक और विकल्प: डिस्क एक प्रक्रिया के कारण पूर्ण हो सकती है जो लगातार डेटा बना रही है: लॉग, कोर और पसंद। यह संभव है कि अंतरिक्ष वास्तव में मुक्त हो रहा है लेकिन तुरंत भर गया है। मैंने वास्तव में ऐसा मामला देखा है। dfइस मामले में बस छेद तस्वीर नहीं देता है। duअधिक जानने के लिए उपयोग करें ।


0

मैं EXT2 का उपयोग कर रहा हूं, FSCK ने इस स्थिति में मेरी मदद की। Shudown -F अब कोशिश करो, कुछ पुनरारंभ और fscks के बाद, मैं आधा इस्तेमाल किया स्थान देखते हैं।


1
प्रिय मार्सेलस, आपका समाधान स्वीकृत उत्तर द्वारा समाहित है; और कभी-कभी आप रिबूट नहीं करना चाहते हैं यदि आप मजबूर नहीं हैं ...
हिरन हंटर

-1

यह जांचने के लिए कि कौन सी हटाई गई फ़ाइलों में मेमोरी है, कमांड दर्ज करें

 $ sudo lsof | grep deleted

यह हटाए गए फ़ाइलों को दिखाएगा जो स्मृति रखता है।

फिर प्रक्रिया को पिड या नाम से मारें

$ sudo kill <pid>
$ df -h

अब आप एक ही स्मृति होगा की जाँच करें

यदि नीचे दी गई कमांड टाइप नहीं है, तो देखें कि कौन सी फ़ाइल मेमोरी पर कब्जा कर रही है

# cd /
# du --threshold=(SIZE)

किसी भी आकार का उल्लेख करें यह दिखाएगा कि कौन सी फाइलें थ्रेशोल्ड आकार से ऊपर हैं और उस फ़ाइल को हटा दें जिसे आप मेमोरी को बरकरार रखेंगे


-4

ओपन टर्मिनल इस कमांड को df के लिए आज़माएं -इसके बाद इस कमांड sudo du -h --max-गहराई = 1 / का उपयोग करें, इस कमांड में आपको डिस्क उपयोग का विवरण मिलेगा, फिर रूट यूजर के रूप में फाइल को डिलीट करें (रूट-लोकल-शेयर-ट्रैश) और अपनी फ़ाइल को हटा दें

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