ฉันจะเพิ่มขีด จำกัด การเปิดไฟล์สำหรับผู้ใช้ที่ไม่ใช่รูทได้อย่างไร?


143

สิ่งนี้เกิดขึ้นใน Ubuntu Release 12.04 (แม่นยำ) Kernel Linux 64 บิต 3.2.0-25- เสมือน

ฉันพยายามเพิ่มจำนวนไฟล์ที่อนุญาตให้ผู้ใช้เปิด สิ่งนี้มีไว้สำหรับแอ็พพลิเคชัน eclipse java ของฉันซึ่งขีด จำกัด 1024 ปัจจุบันไม่เพียงพอ

จากการโพสต์ที่ฉันพบฉันควรจะใส่บรรทัดลงไป

/etc/security/limits.conf เช่นนี้:

soft nofile 4096
hard nofile 4096

เพื่อเพิ่มจำนวนไฟล์ที่อนุญาตให้เปิดสำหรับผู้ใช้ทั้งหมด

แต่นั่นไม่ได้ผลสำหรับฉันและฉันคิดว่าปัญหาไม่เกี่ยวข้องกับไฟล์นั้น

สำหรับผู้ใช้ทั้งหมดขีด จำกัด เริ่มต้นคือ 1024 โดยไม่คำนึงถึงสิ่งที่อยู่ใน /etc/security/limits.conf (ฉันรีบูตเครื่องหลังจากเปลี่ยนไฟล์นั้น)

$ ulimit -n
1024

ตอนนี้แม้จะมีรายการใน /etc/security/limits.conf ฉันไม่สามารถเพิ่มได้:

$ ulimit -n 2048

-bash: ulimit: เปิดไฟล์: ไม่สามารถแก้ไขข้อ จำกัด : ไม่อนุญาตการดำเนินการส่วนที่แปลกคือฉันสามารถเปลี่ยนขีด จำกัดลงแต่ไม่สามารถเปลี่ยนขึ้นไปข้างบน - แม้จะกลับไปเป็นตัวเลขที่ต่ำกว่าขีด จำกัด เดิม:

$ ulimit -n 800
$ ulimit -n
800

$ ulimit -n 900

-bash: ulimit: open files: cannot modify limit: Operation not permitted

ในฐานะที่เป็น root ฉันสามารถเปลี่ยนขีด จำกัด นั้นเป็นอะไรก็ได้ที่ฉันต้องการขึ้นหรือลง ดูเหมือนจะไม่สนใจเกี่ยวกับขีด จำกัด ทั้งระบบที่คาดคะเนใน / proc / sys / fs / file-max

# cat /proc/sys/fs/file-max
188897

# ulimit -n 188898
# ulimit -n 
188898

แต่แม้ฉันจะได้รับ eclipse ให้ทำงานในฐานะ root แอปพลิเคชันของฉันยังคงทำงานล้มเหลวเนื่องจากข้อยกเว้น "Too Many Open File"!

จนถึงตอนนี้ฉันยังไม่พบวิธีเพิ่มขีด จำกัด การเปิดไฟล์สำหรับผู้ใช้ที่ไม่ใช่รูท

ฉันควรทำสิ่งนี้อย่างถูกต้องอย่างไร? ฉันได้ดูโพสต์อื่น ๆ หลายแห่ง แต่ไม่มีโชค!


6
นอกจากนี้โปรดทราบว่าหลังจากที่คุณแก้ไข/etc/security/limits.confคุณอาจต้องออกจากระบบและกลับเข้ามาก่อนจึงจะสามารถใช้ขีด จำกัด สูงสุดใหม่ได้ ฉันทำสิ่งนี้และรู้สึกงุนงงเมื่อulimit -Hsยังแสดง 1,000 เมื่อฉันเพิ่งยกเป็น 1000000! จากนั้นฉันออกจากระบบและกลับเข้ามาและ ulimit แสดงจำนวนเงินใหม่
Cerin

สำหรับเซสชัน GUI คุณอาจพบว่ามีความสำคัญ (Ubuntu 16+) เธรดนี้
Waldemar Wosiński

คำตอบ:


142

ulimitคำสั่งโดยค่าเริ่มต้นการเปลี่ยนแปลงข้อ จำกัด HARD ที่คุณ (ผู้ใช้) สามารถลด แต่ไม่สามารถยกระดับ

ใช้ตัวเลือก-Sเพื่อเปลี่ยนขีด จำกัดSOFTซึ่งสามารถอยู่ระหว่าง 0- { HARD }

ฉันได้ aliased จริงulimitไปulimit -Sจึงเริ่มต้นที่ขีด จำกัด นุ่มตลอดเวลา

alias ulimit='ulimit -S'

/etc/security/limits.confสำหรับปัญหาของคุณคุณกำลังขาดหายไปของคอลัมน์ในรายการของคุณใน

ควรมีสี่คอลัมน์ แต่คอลัมน์แรกหายไปในตัวอย่างของคุณ

* soft nofile 4096
* hard nofile 4096

คอลัมน์แรกอธิบายถึงขีด จำกัด ที่จะใช้ '*' เป็นสัญลักษณ์แทนหมายถึงผู้ใช้ทั้งหมด ในการเพิ่มขีด จำกัด สำหรับรูทคุณต้องป้อน 'root' แทน '*' อย่างชัดเจน

คุณต้องแก้ไข/etc/pam.d/common-session*และเพิ่มบรรทัดต่อไปนี้ที่ส่วนท้าย:

session required pam_limits.so

1
ฉันจะเปลี่ยนขีด จำกัด ฮาร์ดสำหรับจำนวนตัวอธิบายไฟล์ที่เปิดสูงสุดได้อย่างไร ปัญหาของฉันคือฉันต้องอนุญาตให้แอปพลิเคชัน Eclipse ของฉันมีไฟล์ open open ได้มากเท่าที่ต้องการ แต่ขีด จำกัด ของ 4096 นั้นไม่เพียงพอและฉันต้องการตั้งให้สูงถึง 500000 เท่าที่จะทำได้ เป็นไปตามที่คุณพูดกับดาวและยังคงเป็นขีด จำกัด ฮาร์ดไม่เคลื่อนไหว
iCode

1
คุณค้นพบค่าของ / proc / sys / fs / file-max สูงสุดคือ 188,897 ... ดังนั้นฉันจะบอกว่าขีด จำกัด สูงสุดของคุณอยู่ระหว่าง 188,000 (อนุญาต) และ 500,000 (ไม่ได้รับอนุญาต) หลีกเลี่ยงความคิดที่ว่าคุณมีบางสิ่งที่ต้องการมากกว่า 65,000 ไฟล์ที่เปิดพร้อมกัน ว้าว. โดยปกติแล้วจะจัดการกับเหล็กขนาดใหญ่ ฉันสงสัยการเขียนโปรแกรมเอ่อเข้าใจผิด (ด้วยความเคารพจากทั้งหมดโปรด)
lornix

4
นั่นคือมัน: เซสชั่นที่ต้องการ pam_limits.so ขอบคุณ!
ตาย

13
ตอนแรกฉันพลาดไวลด์การ์ดในตอนท้าย/etc/pam.d/common-session*และเพิ่งแก้ไขcommon-sessionและแม้หลังจากรีบูตเครื่องมันก็ไม่ทำงาน แต่หลังจากการเพิ่มบรรทัดเดียวกัน (สำหรับpam_limits.so) ไปcommon-session-noninteractive, ulimit -nแสดงค่าใหม่หลังจากที่เข้าสู่ระบบสด (บูตไม่จำเป็น) FWIW ฉันพยายามเปลี่ยนขีด จำกัด ของรูท (เท่านั้น)
Lambart

1
ตรวจสอบว่าค่าต่างกันหรือไม่ถ้าล็อกอินเป็นรูท superuser.com/questions/1200539/…
Robbo_UK

20

หากคุณใช้การ จำกัด แบบ soft และ hard สำหรับผู้ใช้แต่ละคนคุณสามารถใช้สิ่งต่อไปนี้:

su USER --shell /bin/bash --command "ulimit -n"

เพื่อตรวจสอบว่าการตั้งค่าของคุณทำงานสำหรับผู้ใช้นั้นหรือไม่


5

ฉันมีปัญหามากมายในการทำให้เรื่องนี้ทำงาน

การใช้สิ่งต่อไปนี้ช่วยให้คุณสามารถอัปเดตได้โดยไม่คำนึงถึงสิทธิ์ผู้ใช้ของคุณ

sudo sysctl -w fs.inotify.max_user_watches=100000

4
ฉันลองสิ่งนี้ตั้งแต่ฉันมีปัญหาเดียวกัน แต่มันใช้งานไม่ได้$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.