Các giá trị giới hạn có được áp dụng trên cơ sở mỗi quá trình không?


25

Tôi đang điều chỉnh nofilegiá trị /etc/security/limits.confcho người dùng tiên tri của mình và tôi có một câu hỏi về hành vi của nó: có nofilegiới hạn tổng số tệp mà người dùng có thể mở cho tất cả các quy trình của nó hay không giới hạn tổng số tệp mà người dùng có thể có mở cho mỗi quá trình của nó?

Cụ thể, cho cách sử dụng sau:

oracle                  hard    nofile                  65536

Câu trả lời:


23

Hầu hết các giá trị trong limits.conflà các giới hạn có thể được đặt bằng ulimitlệnh shell hoặc lệnh setrlimitgọi hệ thống. Chúng là thuộc tính của một quá trình. Các giới hạn áp dụng độc lập cho từng quy trình. Đặc biệt, mỗi quá trình có thể có tối đa để nofilemở tệp. Không có giới hạn đối với số lượng tệp đang mở được tích lũy bởi các quy trình của người dùng.

Các nprocgiới hạn là một chút của một trường hợp đặc biệt, ở chỗ nó không tổng hợp trên tất cả các quá trình của một người dùng. Tuy nhiên, nó vẫn áp dụng cho mỗi quy trình: khi một quy trình gọi forkđể tạo quy trình mới, cuộc gọi bị từ chối nếu số lượng quy trình thuộc về euid của quy trình sẽ lớn hơn RLIMIT_NPROCgiá trị của quy trình .

Các limits.conftrang người đàn ông giải thích rằng các giới hạn áp dụng cho một phiên làm việc. Điều này có nghĩa là tất cả các quy trình trong một phiên sẽ có cùng các giới hạn này (trừ khi được thay đổi bởi một trong các quy trình này). Điều đó không có nghĩa là bất kỳ khoản tiền nào được thực hiện qua các quy trình trong một phiên (đó thậm chí không phải là thứ mà hệ điều hành theo dõi - có một khái niệm về phiên, nhưng nó tốt hơn so với điều đó, ví dụ, mỗi ứng dụng X11 có xu hướng kết thúc lên trong phiên riêng của nó). Cách thức hoạt động là quá trình đăng nhập tự đặt ra một số giới hạn và chúng được kế thừa bởi tất cả các quy trình con.

¹ Các trường hợp ngoại lệ là maxlogins, maxsysloginschroot, được áp dụng như một phần của quá trình đăng nhập để từ chối hoặc ảnh hưởng đăng nhập.


Ngược lại, điều đó có nghĩa là các phiên khác nhau có thể có các bộ giới hạn khác nhau?
CMCDragonkai

1
@CMCDragonkai Có, ví dụ: nếu limit.confthay đổi giữa thời gian các phiên được mở hoặc nếu các giới hạn khác nhau (chúng phải nhỏ hơn ngoại trừ root) được đặt .profile.
Gilles 'SO- ngừng trở thành ác quỷ'

1
@laimison Nếu bạn lặp lại tất cả các quy trình đang chạy và chạy prlimit --pid $pidtrên mỗi quy trình , bạn có thể thay đổi giới hạn cho một phiên hoạt động một cách hiệu quả. Lưu ý rằng bạn có thể phải thực hiện một vài lần trong trường hợp một số quy trình bị rẽ nhánh trong khi bạn đang lặp lại.
Gilles 'SO- ngừng trở nên xấu xa'

1
@laimison Không. Giả sử rằng người dùng chỉ có hai quy trình A và B, RLIMIT_NPROCđược đặt thành 2 trong A và 3 trong B. Sau đó B có thể rẽ nhánh thêm một quy trình, nhưng A không thể.
Gilles 'SO- ngừng trở nên xấu xa'

1
@laimison Nếu bạn đặt giới hạn thành 2 trong cha mẹ của B và không thay đổi nó thành B sau khi đổi, thì giới hạn của B sẽ là 2. Nếu bạn đặt giới hạn thành 2 trong cha mẹ của B nhưng bạn tăng giới hạn ở B hoặc nếu bạn đặt giới hạn thành 3 trong cha mẹ của B trước khi chuyển B và đặt thành 2 sau khi yêu cầu B, B sẽ có giới hạn được đặt thành 3. Giới hạn duy nhất quan trọng là giới hạn trong quy trình gọi fork (), không phải giới hạn trong quá trình đó là cha mẹ hoặc trong bất kỳ quá trình khác.
Gilles 'SO- ngừng trở nên xấu xa'
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.