Sự khác biệt giữa giới hạn ulimit -n và / Proc / $ PID /


9

Trong Linux, có giới hạn tệp mở. Tôi có thể sử dụng ulimit -nđể xem giới hạn tệp mở, là 1024 mặc định. Sau đó, tôi cũng có thể thấy mỗi quá trình mở tệp giới hạn mềm / cứng bằng cách xem / Proc / $ PID / giới hạn. Tôi thấy mềm = 1024 và cứng = 4096.

Tôi tự hỏi sự khác biệt giữa hai đầu ra này là gì?

Ngoài ra, làm setRlimit()getRlimit()áp dụng cho toàn hệ thống hoặc theo quy trình?

Câu trả lời:


11

ulimit -nđặt giới hạn mềm theo mặc định; bạn có thể thêm -Htùy chọn để xem / đặt giới hạn cứng.

Đối với hầu hết các phần, giới hạn mềm và cứng hoạt động như thế này:

  1. các quy trình của root (thực ra, bất kỳ quy trình nào CAP_SYS_RESOURCE) có thể tăng hoặc giảm bất kỳ giới hạn nào đối với bất kỳ quy trình nào.
  2. mọi quy trình của người dùng có thể hạ thấp mọi giới hạn đối với các quy trình khác thuộc sở hữu của người dùng đó.
  3. mọi quy trình của người dùng có thể tăng giới hạn mềm lên đến giới hạn cứng đối với các quy trình do người dùng đó sở hữu.
  4. Nếu một quá trình cố gắng vượt quá giới hạn mềm của nó, nỗ lực sẽ thất bại.

Vì vậy, giới hạn cứng hoạt động như một nắp trên giới hạn mềm (ngoại trừ root, người bình thường có thể làm bất cứ điều gì).

Có một ngoại lệ: Giới hạn CPU mềm sẽ gửi SIGXCPUtín hiệu. Một quá trình có thể chọn để bỏ qua điều đó, hoặc dành thời gian làm dọn dẹp, vv Một khi giới hạn CPU cứng được vượt qua, hạt nhân gửi SIGKILL-which không catchable, handleable, hoặc có thể bỏ qua. Vì vậy, trong trường hợp này, giới hạn mềm có chức năng như một cảnh báo "bạn đã hết thời gian CPU, hãy kết thúc và thoát ngay lập tức, nếu không!" và giới hạn cứng là "hoặc cách khác."

Hầu hết là trên mỗi quy trình, nhưng một số ít (như RLIMIT_NPROC) là cho mỗi người dùng. Các getrlimit (2) thủ công trang quy định cụ thể đối với từng giới hạn.


Một câu hỏi liên quan khác, tại sao đôi khi vỏ của tôi có ulimit -n = 1024 và một quá trình khác được bắn ra từ vỏ này có giới hạn mềm = 4096 (đọc từ / Proc / PID / giới hạn)
sdeLevelNegativeTwo

@sdeLevelNegativeTwo Bạn đã thực hiện quy trình trước hay sau ulimit -n? Nó không ảnh hưởng đến các quá trình đã bị loại bỏ, chỉ có vỏ và tương lai. Ngoài ra, quá trình có thể tăng giới hạn mềm của nó đến giới hạn cứng. Vì vậy, bạn có thể sử dụng ulimit -H -nđể ngăn chặn nó.
derobert
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.