बहुत सारी खुली हुई फाइलें - अपराधी को कैसे खोजना है


69

दौड़ते समय tail -f filename, मुझे निम्नलिखित संदेश मिला:

tail: inotify cannot be used, reverting to polling: Too many open files

क्या यह एक संभावित समस्या है?

मैं कैसे निदान करूं कि सभी खुली फाइलों के लिए क्या जिम्मेदार है? मेरे पास संदिग्ध प्रक्रियाओं की एक सूची है, लेकिन अगर वे अपराधी नहीं हैं, तो निर्देश जो कि यह जानने में भरोसा नहीं करते कि किस प्रक्रिया की जाँच करना उपयोगी होगा।


1
क्या आपने उपलब्ध फ़ाइल डिस्क्रिप्टर की संख्या में वृद्धि की है ulimit?
इग्नासियो वाज़क्वेज़-अब्राम्स

2
@ IgnacioVazquez-Abrams अन्य उपयोगकर्ताओं के लिए उपयोगी हो सकता है, लेकिन मेरे लिए यह बीमारी के बजाय लक्षण का इलाज करने की तरह महसूस होगा।
एंड्रयू ग्रिम

जबकि आप गलत नहीं हैं, कभी-कभी ऐप्स के पास कई फाइलें खुली होने के वैध कारण होते हैं।
इग्नासियो वाज़क्वेज़-अब्राम्स

जवाबों:


71

आप यह समझने के लिए lsof का उपयोग कर सकते हैं कि कौन कितनी फाइलें खोल रहा है। आमतौर पर यह एक (वेब) सर्वर है जो बहुत सारी फाइलें खोलता है, लेकिन lsof निश्चित रूप से आपको कारण की पहचान करने में मदद करेगा।

एक बार जब आप समझ जाते हैं कि बुरा आदमी कौन है

अगर lsof से आउटपुट बहुत बड़ी है तो इसे किसी फ़ाइल में रीडायरेक्ट करने की कोशिश करें और फिर फ़ाइल खोलें

उदाहरण (आपको पहले कमांड को Ctrl+ Cकरना पड़ सकता है )

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
आलसी के लिए:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
इसका नाड़ोक

1
मुझे वही त्रुटि मिली और ulimit का उपयोग करने से काम नहीं चलता। टेल -F कमांड अभी भी त्रुटि देता है। मैंने 1024 से 3000 की सीमा बढ़ा दी है, इसलिए मुझे लगता है कि मेरे पास तब तक पर्याप्त जगह होगी ... मुझे लगता है कि मुझे रिबूट करना होगा!
एलेक्सिस विलके

15
मैं itsadok की लाइन उपयोगी पाया है, लेकिन मुझे लगता है कि आप पहली बार को सॉर्ट करना चाहिए (क्योंकि uniqकेवल आसन्न लाइनों के साथ काम करता है), uniq चलाने के लिए, तो तरह फिर से। तो lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
टायलर कोलियर

19
सबसे अधिक फाइलों को खोलना और गिनना निश्चित रूप से सबसे अच्छी बात है। प्रक्रिया का नाम और साथ ही pid दिखाएं: '' 'lsof | awk '{प्रिंट $ 2 "" $ 1; } '| sort -rn | uniq -c | sort -rn | शीर्ष -20 ''
गौतही

2
@gaoithe अगर आप इसे एक उत्तर में रखते हैं तो मैं ख़ुशी से इसे बढ़ा दूंगा:)
मैट बॉल

23

मामले में किसी और की जरूरत है ...

ulimit -a

सभी वर्तमान सीमाओं को प्रदर्शित करेगा। विशेष ulimit -n 70000रूप से फ़ाइल डिस्क्रिप्टर की सीमा निर्धारित होगी।

इसके अलावा ...

cat /proc/sys/fs/file-max

संपादित होने पर कर्नेल सीमा प्रदर्शित / सेट करेगा।

sudo echo 200000 > /proc/sys/fs/file-max

एक और अधिक विस्तृत विवरण में पाया जा सकता है ...

मैं गैर-रूट उपयोगकर्ता के लिए खुली फ़ाइलों की सीमा कैसे बढ़ाऊं?


3
ulimits हैं इसलिए आप अपने सिस्टम में संसाधन उपयोग पर कड़ा नियंत्रण रख सकते हैं। उन प्रक्रियाओं के लिए उन्हें व्यक्तिगत रूप से बढ़ाना सबसे अच्छा है जिन्हें आप जानते हैं कि उन्हें कई फ़ाइल विवरणों का उपयोग करने की आवश्यकता होगी। परीक्षण में उन्हें चुस्त रखने से आपको ऐसी प्रक्रियाएं मिलेंगी जो समय के साथ फाइल डिस्क्रिप्टर को लगातार लीक कर सकती हैं। यह भी ध्यान दें कि फ़ाइल हैंडल का उपयोग यूनिक्स / लिनक्स में किसी भी उपकरण के उपयोग के लिए किया जाता है। उदाहरण के लिए एक प्रक्रिया द्वारा खुला हर नेटवर्क सॉकेट एक फ़ाइल हैंडल का उपयोग करता है। यह बताता है कि आप नियमित फ़ाइल-सिस्टम फ़ाइलों के साथ-साथ नेटवर्क कनेक्शन जैसी किसी भी डिवाइस फ़ाइलों के मामले में "बहुत अधिक खुली फाइलें" क्यों मार सकते हैं।
गौइथे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.