सवाल फ़ाइल हटाने के बाद लिनक्स में डीएफ सही खाली स्थान नहीं दिखा रहा है


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

मुझे मिला noatime घुड़सवार विभाजन पर ध्वज अगर इससे कोई फर्क पड़ता है।


107
2018-02-08 07:36


मूल


क्या यह एक विभाजन या सभी विभाजनों पर हो रहा है? - Khaled
खैर, यह मेरे मुख्य डेटा विभाजन पर हो रहा है, जो केवल मेरी देखभाल करता है, क्योंकि मैं केवल फाइलों को लिखता / हटाता हूं।
कृपया मुझे समाधान, या एक लिंक के साथ प्रबुद्ध करें।
फाइल सिस्टम क्या है? डीएफ सुपरब्लॉक की एक स्टेट करता है, हो सकता है कि आपका फाइल सिस्टम एसबी इनोड को अपडेट नहीं कर रहा है। क्या आपने कैश फ्लश करने की कोशिश की है? - beans
Ext4 का उपयोग करना। आप कैसे कैश फ्लश करते हैं?


जवाब:


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

उपयोग

lsof +L1

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


181
2018-02-08 07:48



हटाए गए फ़ाइलों को एक महीने से अधिक तक नहीं पहुंचाया गया था, और एकमात्र प्रक्रिया जो उन्हें एक्सेस करती है वह nginx है, इसलिए यह संदिग्ध है।
+1। इसके अलावा, "lsof + L1" आपको बताएगा कि कौन सा प्रोग्राम फाइलें खोल रहा है। - pehrs
रूट के रूप में "lsof -n | grep फ़ाइल" चलाते हैं, आप आश्चर्यचकित होंगे कि प्रक्रियाओं के कारण फ़ाइलों को कितनी देर तक टिक सकता है क्योंकि उन्हें किसी भी कारण से खोलना है। अगर सब कुछ विफल हो जाता है, रीबूट करें, मुझे बुरा सुझाव है कि यह सुझाव दे रहा है लेकिन यह निश्चित रूप से सुनिश्चित करेगा कि फाइल पर कुछ भी नहीं है। प्रति pehrs, lsof + एल 1 शायद जाने का बेहतर तरीका है। - ScottZ
तुमने मुझे बचा लिया! एक 93 जी लॉग फ़ाइल हटा दी गई और अंतरिक्ष वापस नहीं मिला और क्यों काम नहीं कर सका। धन्यवाद। - Luke Cousins
एक ही पंक्तियों के साथ और यदि यह दूसरों की सहायता करता है, तो मैंने एक बड़ी nginx access.log फ़ाइल मिटा दी लेकिन nginx को पुनरारंभ करने के बाद ही स्थान पुनः प्राप्त करने में सक्षम था: सेवा nginx पुनरारंभ करें - Nick


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

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

पहले 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" फाइल डिस्क्रिप्टर होगा। अब उस स्थान को पुनः प्राप्त करने के लिए "> एफडी" टाइप करें

> 1

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


21
2018-02-07 01:24



इससे क्या होता है > FD करना? - Pred
यह फाइल डिस्क्रिप्टर को हटा देता है - Adrián Deccico
क्या ये > कमांड का नाम है? इसका उपयोग करने में सक्षम होने के लिए मुझे zsh से bash में स्विच करना पड़ा। क्या इसे zsh पर चलाने के लिए संभव है? - ariera
यह एक आउटपुट रीडायरेक्ट है और इसलिए फ़ाइल को छोटा करता है। लंबे समय से "echo -n> 1" या "true> 1" होगा। यह वास्तव में एफडी को नहीं हटाता है, यह सिर्फ बाद में एक खाली फ़ाइल को इंगित करता है। - eckes


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

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


8
2018-02-08 10:01





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

  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 यह जांचने के लिए कि क्या अंतरिक्ष पहले से ही मुक्त हो चुका है या नहीं। यदि यह अभी भी भरा हुआ है, तो आपको कुछ सेकंड इंतजार करना होगा और फिर से जांचना होगा।


3
2018-02-16 05:31





यदि विभाजन केवल रूट उपयोग के लिए डिस्क स्थान के कुछ हिस्से को आरक्षित करने के लिए कॉन्फ़िगर किया गया है, 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>

2
2018-05-08 10:31





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

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

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


1
2018-02-08 10:11





चूंकि मुझे पता है कि आप में से एक टन रेडहाट के लिए ऐसा कर रहा है /var और fz को कम करने की अपेक्षा रखने वाली फ़ाइलों को gzipping, लेकिन इसके बजाय यह बढ़ता है, बस सुनिश्चित करें कि आप सेवा syslog पुनरारंभ करें। तथा

lsof -v file

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


1
2018-03-23 15:02



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


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


0
2017-07-17 12:01





मैं EXT2 का उपयोग कर रहा हूं, एफएससीके ने मुझे इस स्थिति में मदद की। शूडाउन का प्रयास करें -फ अब, कुछ पुनरारंभ करने और fscks के बाद, मुझे आधा उपयोग की जगह दिखाई देती है।


0
2018-01-16 09:00



प्रिय मार्सेलस, आपका समाधान स्वीकार किए गए उत्तर से घिरा हुआ है; और कभी-कभी आप रीबूट नहीं करना चाहते हैं अगर आपको मजबूर नहीं किया जाता है ... - Deer Hunter