क्या OS X 10.7.1 पर "सिस्टम में बहुत अधिक खुली फ़ाइलें" त्रुटि के लिए कोई फिक्स है?


190

मुझे OS X 10.7.1 पर "सिस्टम में बहुत अधिक खुली फाइलें" सीमा से pesky से छुटकारा पाने की आवश्यकता है। 

क्या उधर रास्ता है?


4
क्या आप इस बारे में अधिक जानकारी देना चाहते हैं कि ऐसा कब होता है? किन परिस्थितियों में?
slhck

1
@ एलशॉक - मुझे भी यही समस्या है। परिस्थितियां मूल रूप से "यादृच्छिक पर" हैं। मैं एक डेवलपर हूं, इसलिए मैं अपने मैक का काफी जोर से उपयोग कर रहा हूं: एक या एक से अधिक डेटाबेस, एक वेब सर्वर, परीक्षण उपकरण, एक या अधिक ब्राउज़र, और एक ही बार में एक म्यूजिक प्लेयर चलाना। Google Chrome एक ऐसा प्रोग्राम लगता है जिसमें बहुत सारी फाइलें खुली होती हैं।
नाथन लॉन्ग

दरअसल, मेरा "भारी उपयोग" मुद्दा नहीं था; कर्नेल और प्रति-प्रक्रिया के लिए खुली फ़ाइलों की अधिकतम संख्या के लिए मेरी सेटिंग्स चूक से कम होनी चाहिए।
नाथन लॉन्ग

2
अगर आपके नाथन की टिप्पणी पढ़ी और सोचा कि उन्होंने चूक के बारे में कोई विवरण क्यों शामिल नहीं किया है, तो इसका कारण यह है कि उन्होंने अपने जवाब में इसे नीचे दिया। (अच्छा जवाब! :)
ओली

मैं नाथन लॉन्ग के समान उपयोग की स्थिति में हूं, और पाया कि अपाचे को फिर से शुरू करना एकमात्र कदम था जिसने समस्या को "हल" कर दिया। मैंने नीचे दी गई सभी सीमाएँ बढ़ा दीं, लेकिन उन्होंने तुरंत मदद नहीं की। मैं कमांड लाइन phpUnit परीक्षण> सेलेनियम सर्वर> फ़ायरफ़ॉक्स> अपाचे> php> mysql सभी एक ही मैकबुक पर चला रहा हूं। जब तक मैं मावेरिक्स में उन्नत नहीं हो जाता तब तक ठीक काम करता था। मुझे जो त्रुटि मिलती है, उसका परीक्षण किया जा रहा है, यानी यह php / apache फाइलों से बाहर चल रहा है, इसलिए संभवतः शेल सेटिंग द्वारा नियंत्रित नहीं किया गया है।
scipilot

जवाबों:


225

इस सहायक लेख के अनुसार (जो मैं पढ़ने की सलाह देता हूं):

डिफ़ॉल्ट रूप से, मैक ओएस एक्स को खोलने वाली फ़ाइलों की अधिकतम संख्या 12,288 पर सेट हो सकती है और किसी दी गई प्रक्रिया की अधिकतम संख्या 10,240 हो सकती है।

आप इनसे जांच कर सकते हैं:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

आप (अपने जोखिम पर) सीमा बढ़ा सकते हैं:

  • sysctl -w kern.maxfiles=20480 (या जो भी संख्या आप चुनते हैं)
  • sysctl -w kern.maxfilesperproc=18000 (या जो भी संख्या आप चुनते हैं)

परिवर्तन को स्थायी बनाने के लिए, sudoअपनी सेटिंग्स /etc/sysctl.conf(जो आपको बनानी पड़ सकती हैं) को इस तरह से उपयोग करने के लिए इस तरह से करें:

kern.maxfiles=20480
kern.maxfilesperproc=18000

नोट: OS X 10.10 या उससे कम में, आप सेटिंग को इस /etc/launchd.confतरह से जोड़ सकते हैं limit maxfilesऔर यह आपके द्वारा यहां रखी गई चीजों को ओवरराइड करेगा।

फिर से, लेख से:

एक बार जब आप यह कर लेते हैं, तो कर्नेल में अधिकतम फ़ाइलों की संख्या होगी, लेकिन शेल नहीं हो सकता है। और चूंकि अधिकांश प्रक्रियाएँ जो इसे उठाएंगी, वे कई फाइलें हैं जो उस शेल द्वारा शुरू की जाने वाली हैं जिसे आप बढ़ाना चाहते हैं।

इसके लिए आदेश है:

ulimit -S -n 2048 # or whatever number you choose

वह परिवर्तन भी अस्थायी है; यह केवल वर्तमान शेल सत्र के लिए रहता है। आप इसे अपने शेल कॉन्फ़िगरेशन फ़ाइल में जोड़ सकते हैं ( या .bashrc, .zshrcजो भी हो) यदि आप चाहते हैं कि यह हर बार खोलते समय आप चलाएं।


1
लॉन्च क्षेत्र में आइकन पर क्लिक करके लॉन्च की गई प्रक्रियाओं पर क्या सीमा लागू होती है? और उस सीमा को कैसे बदलें? जब आप "शेल" कहते हैं, तो मैं आपको एक इंटरैक्टिव टर्मिनल शेल का मतलब मान रहा हूं।
चेसो

@ शीशे - मुझे लगता है कि समग्र प्रणाली सीमा (sysctl) या लॉन्च सीमा, जो भी कम हो, उसे नियंत्रित करता है।
नाथन लोंग

1
सामग्री सीमा के साथ /etc/launchd.conf बनाने पर अधिकतम 1000000 1000000 मेरे लिए बहुत काम आया! (OSX 10.8.2 यहाँ)
Zugwalt

1
मैंने kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf में डाला और रिबूट किया। kern.maxfiles को अनदेखा किया गया और डिफ़ॉल्ट रूप से रहा, लेकिन kern.maxfilesperproc को 65000 पर सेट किया गया। मेरे पास कोई /etc/launchd.conf नहीं है इसलिए इसके साथ क्या हो रहा है?
Pferrel

2
यदि किसी को अधिकतम फ़ाइलों के चिपके नहीं होने की समस्या है, तो यह इसलिए है क्योंकि अधिकतम लाइनों के बाद एक अनुगामी स्थान है, जिसे हटाने की आवश्यकता है।
jjathman

62

ऐसा लगता है कि ओएस एक्स के प्रत्येक संस्करण के लिए खुली फ़ाइलों की सीमा को बदलने के लिए एक पूरी तरह से अलग विधि है!

ओएस एक्स सिएरा (10.12.X) के लिए आपको निम्न करने की आवश्यकता है:

1./Library/LaunchDaemons/limit.maxfiles.plist निम्नलिखित पर एक फ़ाइल बनाएं और पेस्ट करें (दो नंबरों को बदलने के लिए स्वतंत्र महसूस करें (जो क्रमशः नरम और कठोर सीमाएं हैं):

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">  
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. अपनी नई फ़ाइल के स्वामी को बदलें:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. इन नई सेटिंग्स को लोड करें:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. अंत में, जाँच लें कि सीमाएँ सही हैं:

launchctl limit maxfiles

पूरी तरह से काम किया, धन्यवाद! मेरे मामले में त्रुटि संदेश के साथ एक जावा प्रक्रिया में प्रकट हुईIO Error: Bad file descriptor (Write failed)
agradl

1
इसके अलावा एल Capitan 10.11.6 पर काम करता है
ट्रॉय डेनियल

अभी भी शेल के लिए ulimit नहीं बदल सकता है। अधिकतम 1024 मैं जो कुछ भी करता है
डेटाग्रेड

स्टेप 2 रन पर: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

32

आपको अपनी ulimit सेटिंग्स को बढ़ाने की आवश्यकता होगी - यह इन दिनों OS X पर बहुत कम है - डिफ़ॉल्ट रूप से 256। ulimit -n 4096अपने ~ / .profile या समकक्ष को जोड़ें या समान करें और जो आपके स्थानीय परिवेश में इसे हल करेगा। ulimit -aअपने वर्तमान स्तरों की जाँच करने के लिए चलाएँ

सिस्टम सेटिंग्स देखने के लिए, इसे चलाएं:

launchctl limit maxfiles

यह प्रति प्रक्रिया के आधार पर लायन (10240) में काफी हद तक सेट किया गया है, जो पहले हुआ करता था। लेकिन अगर आप अभी भी इसे वहां मार रहे हैं, तो आप वांछित स्तरों के साथ एक ही कमांड का उपयोग करके इसे उच्चतर सेट कर सकते हैं। परिवर्तनों को स्थायी करने के लिए /etc/launchd.conf वह स्थान है जहाँ आपको संबंधित पंक्तियों को जोड़ना होगा।


1
256? यह मेरे लिए 2560 फ़ाइल डिस्क्रिप्टर है और मैंने इसे कभी नहीं बदला है। सीमा 266 प्रक्रिया (सीएफ ulimit -a) है।
slhck

2
मेरे लिए एक ही है, MacOS एक्स मेवरिक पर 256 फ़ाइलें
Climbatize

4
256 के रूप में अच्छी तरह से ओएस एक्स Yosemite पर
अलेक्जेंडर

2
एल Capitan पर 256, भी।
TMN

1
योसेमाइट में 256।
जाक

31

अन्य विकल्प अपराधी को ढूंढना हो सकता है:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

पिछले एक के लिए आप देख सकते हैं कि क्या फाइलें खुली हैं:

sudo lsof -n | grep socketfil

और अगर वांछित है तो प्रक्रिया को मार डालो

kill $pid

टिप्पणियों से:

इसके लायक क्या है, आप उपयोग की जाने वाली सबसे खुली फाइलों के साथ प्रक्रिया आईडी की सूची भी प्राप्त कर सकते हैं

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

सहायक! लेकिन OS X (10.11) पर सॉर्ट करना -h नहीं है। (शायद
राबर्ट कैलहौन

मेरे लिए बस बिना अच्छा काम किया -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

तो इसके बिना हो-h
sanmai

यह एकमात्र उत्तर है जिसने मुझे मेरे मुद्दे को जड़ बनाने में मदद की .. धन्यवाद :)
SgtPooki

1
lsof -n +c 0ट्रंचिंग प्रक्रिया नाम को रोकने के लिए उपयोग करें ।
वघन

9

दोस्तों, Mavericks पर 10.9.4

ulimit -n 2048ठीक काम करता है। आपको एक नया लॉगिन सत्र शुरू करने की आवश्यकता हो सकती है।


2

नवीनतम macOS के लिए sudo launchctl limit maxfiles 64000 524288( लेखन के समय: 10.14.1), आप उपयोग कर सकते हैं (डिफ़ॉल्ट रूप से यह 256 था), लेकिन यह केवल वर्तमान सत्र के भीतर ही काम करता है। स्थायी समाधान के लिए launchctl@ninjaPixel ( https://superuser.com/a/1171028/760235 ) से नौकरी का उपयोग करें ।


आप 524288 नंबर के साथ कैसे आए? मेरे पिछले मूल्य 256 और असीमित थे।
चिप रॉबर्सन

1

तुम दौड़ सकते हो

lsof -n

कौन सी प्रक्रिया बहुत सारी फाइलें खोलती है।

फिर इसे मार डालो।

या

sysctl -w kern.maxfiles=20480

इसे बड़ा कर दो।


3
कृपया बताएं कि यह उत्तर पहले से दिए गए से अलग है।
स्टीफन राउच

1

मेरे जावा के ऊपर सभी परिवर्तनों के बाद 10000 से अधिक फाइलें नहीं बनीं। समाधान यह jvm ध्वज -XX था: -MaxFDLimit


0

मैंने एक चामोद -R करते हुए इसका सामना किया, इसलिए मैंने इसे छोटे-छोटे कदम उठाते हुए प्राप्त किया, उदा

# for each directory
find . -type d -exec chmod 755 {} \;

1
हालांकि यह एक काम के आसपास हो सकता है, यह वास्तव में सवाल का जवाब देने के लिए प्रकट नहीं होता है। शायद यह समझाते हुए कि आप संदेश से छुटकारा नहीं पा सकते हैं और फिर इसे एक मुद्दे के रूप में प्रस्तावित करने से इसे कम करने के एक तरीके से आपके उत्तर में सुधार होगा।
संगीत 2

0

Https://superuser.com/a/1171028/367819 के समान

अपने Mac OS X सिस्टम पर वर्तमान सीमाओं की जाँच करने के लिए, चलाएँ:

launchctl limit maxfiles

अंतिम दो कॉलम क्रमशः नरम और कठोर सीमाएँ हैं।

मैक ओएस एक्स योसेमाइट में सिस्टम-वाइड आधार पर खुली फ़ाइलों की सीमा को समायोजित करने के लिए, आपको दो कॉन्फ़िगरेशन फ़ाइलों को बनाना होगा। पहली संपत्ति सूची (उर्फ प्लिस्ट) फ़ाइल /Library/LaunchDaemons/limit.maxfiles.plist में है जो निम्न XML कॉन्फ़िगरेशन में शामिल है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

यह 200000 के लिए खुली हुई फ़ाइलों की सीमा तय करेगा। दूसरी सामग्री विन्यास फाइल को /Library/LaunchDaemons/limit.maxproc.plist में निम्नलिखित सामग्रियों के साथ संग्रहित किया जाना चाहिए:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

दोनों plist फ़ाइलों को रूट: व्हील के स्वामित्व में होना चाहिए और अनुमतियाँ -rw-r - r-- होनी चाहिए। यह अनुमतियाँ डिफ़ॉल्ट रूप से होनी चाहिए, लेकिन आप यह सुनिश्चित कर सकते हैं कि वे sudo chmod 644 चला रहे हैं। जबकि ऊपर बताए गए चरण सिस्टम-वाइड खुली फ़ाइल सीमाओं को पुनरारंभ करने के लिए सही तरीके से सेट करने का कारण बनेंगे, आप उन्हें मैन्युअल रूप से लॉंचल सीमा चलाकर लागू कर सकते हैं।

सिस्टम स्तर पर इन सीमाओं को सेट करने के अलावा, हम निम्नलिखित स्तरों को अपने bashrc, bashprofile, या analogous फ़ाइल में जोड़कर सत्र स्तर पर सेट करने की सलाह देते हैं:

ulimit -n 200000
ulimit -u 2048

प्लिस्ट फ़ाइलों की तरह, आपकी bashrc या इसी तरह की फ़ाइल में -rw-r - r-- अनुमतियां होनी चाहिए। इस बिंदु पर, आप अपने कंप्यूटर को पुनरारंभ कर सकते हैं और अपने टर्मिनल में ulimit -n दर्ज कर सकते हैं। यदि आपका सिस्टम सही तरीके से कॉन्फ़िगर किया गया है, तो आपको देखना चाहिए कि अधिकतम 20000 पर सेट किया गया है।


अधिक जानकारी के लिए आप इस लेख का अनुसरण कर सकते हैं।

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


मूल्यों को प्रभावी बनाने के लिए अपने मैक को पुनरारंभ करना याद रखें।


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