Làm cách nào để tăng giới hạn tệp mở cho người dùng không root?


144

Điều này đang xảy ra trên Ubuntu Release 12.04 (chính xác) Kernel Linux 3.2.0-25-virtual

Tôi đang cố gắng tăng số lượng tệp đang mở cho phép người dùng. Điều này là cho ứng dụng java nhật thực của tôi trong đó giới hạn hiện tại là 1024 là không đủ.

Theo các bài đăng tôi đã tìm thấy cho đến nay, tôi sẽ có thể đặt các dòng vào

/etc/security/limits.conf như thế này:

soft nofile 4096
hard nofile 4096

để tăng số lượng tệp được mở cho tất cả người dùng.

Nhưng điều đó không hiệu quả với tôi và tôi nghĩ vấn đề không liên quan đến tập tin đó.

Đối với tất cả người dùng, giới hạn mặc định là 1024, bất kể trong /etc/security/limits.conf (Tôi đã khởi động lại sau khi thay đổi tệp đó)

$ ulimit -n
1024

Bây giờ, mặc dù các mục trong /etc/security/limits.conf tôi không thể tăng điều đó:

$ ulimit -n 2048

-bash: ulimit: open files: không thể sửa đổi giới hạn: Không được phép thao tác Phần kỳ lạ là tôi có thể thay đổi giới hạn xuống dưới , nhưng không thể thay đổi nó lên trên - thậm chí để quay lại số nằm dưới giới hạn ban đầu:

$ ulimit -n 800
$ ulimit -n
800

$ ulimit -n 900

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

Là root, tôi có thể thay đổi giới hạn đó thành bất cứ điều gì tôi muốn, lên hoặc xuống. Nó thậm chí dường như không quan tâm đến giới hạn được cho là toàn hệ thống trong / Proc / sys / fs / file-max

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

# ulimit -n 188898
# ulimit -n 
188898

Nhưng ngay cả khi tôi nhận được nhật thực để chạy bằng root, ứng dụng của tôi vẫn gặp sự cố vì ngoại lệ "Quá nhiều tệp mở"!

Cho đến nay, tôi chưa tìm thấy cách nào để tăng giới hạn tệp mở cho người dùng không phải root.

Làm thế nào tôi nên làm điều này đúng? Tôi đã xem một số bài viết khác nhưng không có may mắn!


6
Ngoài ra, lưu ý rằng sau khi bạn chỉnh sửa /etc/security/limits.conf, bạn có thể phải đăng xuất và sau đó quay lại trước khi bạn có thể sử dụng giới hạn tối đa mới. Tôi đã làm điều này, và bị bối rối khi ulimit -Hsvẫn hiển thị 1000 khi tôi vừa nâng nó lên 1000000! Sau đó tôi đăng xuất và đăng nhập lại, và ulimit cho thấy số tiền mới.
Cerin

Đối với phiên GUI, bạn có thể thấy chủ đề này cũng quan trọng (Ubuntu 16+) .
Waldemar Wosiński

Câu trả lời:


142

Các ulimitlệnh theo mặc định thay đổi giới hạn HARD, mà bạn (người dùng) có thể làm giảm, nhưng không thể nâng cao.

Sử dụng tùy chọn -S để thay đổi giới hạn PHẦN MỀM , có thể nằm trong khoảng từ 0- { HARD }.

Tôi đã thực sự aliased ulimitđể ulimit -S, vì vậy nó mặc định là các giới hạn mềm tất cả các thời gian.

alias ulimit='ulimit -S'

Đối với vấn đề của bạn, bạn đang thiếu một cột trong các mục của bạn /etc/security/limits.conf.

Cần có BỐN cột, nhưng cột đầu tiên bị thiếu trong ví dụ của bạn.

* soft nofile 4096
* hard nofile 4096

Cột đầu tiên mô tả WHO giới hạn là áp dụng cho. '*' là ký tự đại diện, có nghĩa là tất cả người dùng. Để tăng giới hạn cho root , bạn phải nhập rõ ràng 'root' thay vì '*'.

Bạn cũng cần chỉnh sửa /etc/pam.d/common-session*và thêm dòng sau vào cuối:

session required pam_limits.so

1
Làm cách nào để thay đổi giới hạn cứng cho số lượng mô tả tệp mở tối đa? Vấn đề của tôi là tôi cần cho phép ứng dụng Eclipse của mình có nhiều tệp mở như nó muốn nhưng giới hạn 4096 là không đủ và tôi muốn đặt nó ở mức cao nhất có thể có thể là 500000. Cài đặt của tôi trong giới hạn. là như bạn đã đề cập với ngôi sao và giới hạn cứng vẫn không di chuyển.
iCode

1
Chà, bạn đã phát hiện ra giá trị của / Proc / sys / fs / file-max là 188.897 ... Vì vậy, tôi muốn nói giới hạn trên của bạn là từ 188.000 (được phép) và 500.000 (không được phép). Nghĩ rằng bạn đã có một cái gì đó yêu cầu hơn 65000 tệp đang mở. Ồ Thông thường đó là xử lý trên sắt lớn. Tôi nghi ngờ về một chương trình, uh, quan niệm sai lầm. (Với tất cả sự tôn trọng, xin vui lòng)
lornix

4
đó là nó: phiên yêu cầu pam_limits.so, cảm ơn!
lethalman

13
Lúc đầu, tôi đã bỏ lỡ ký tự đại diện vào cuối /etc/pam.d/common-session*và chỉ chỉnh sửa common-session, và thậm chí sau khi khởi động lại, nó không hoạt động. Nhưng sau khi thêm cùng một dòng (for pam_limits.so) vào common-session-noninteractive, ulimit -nhiển thị giá trị mới sau khi đăng nhập mới (không cần khởi động lại). FWIW Tôi đã cố gắng thay đổi giới hạn cho root (chỉ).
Lambart

1
cũng kiểm tra nếu giá trị khác nhau nếu đăng nhập bằng root. superuser.com/questions/1200539/
Mạnh

20

Nếu bạn sử dụng giới hạn mềm và cứng trên cơ sở mỗi người dùng, bạn có thể sử dụng một số thứ như:

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

để kiểm tra xem cài đặt của bạn có hoạt động cho người dùng cụ thể đó hay không.


5

Tôi gặp nhiều rắc rối khi làm việc này.

Sử dụng như sau cho phép bạn cập nhật nó bất kể sự cho phép của người dùng của bạn.

sudo sysctl -w fs.inotify.max_user_watches=100000

4
Tôi đã thử điều này vì tôi gặp vấn đề tương tự nhưng nó không hoạt động$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster 7/12/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.