Cách kiểm tra sử dụng ulimit


29

Có cách nào để kiểm tra việc sử dụng các ulimits cho một người dùng nhất định không? Tôi biết rằng bạn có thể thay đổi các vết loét cho một quy trình khi bạn khởi động nó hoặc cho một vỏ duy nhất khi chạy nhưng tôi muốn có thể "theo dõi" mức độ gần gũi của người dùng để đạt giới hạn của họ. Tôi đang lên kế hoạch viết một bashkịch bản sẽ báo cáo lại cho thống kê tỷ lệ phần trăm sử dụng hiện tại. Cụ thể, tôi muốn theo dõi:

  1. mở tệp ( ulimit -n)
  2. quy trình người dùng tối đa ( ulimit -u)
  3. tín hiệu chờ xử lý ( ulimit -i)

Những gì tôi muốn là tỷ lệ sử dụng (0-100).


nếu bạn đã bật quy trình kế toán trong kernel, bạn có thể thu thập số liệu thống kê sử dụng chi tiết về người dùng của mình.
casey

Làm thế nào để bạn bật quy trình kế toán?
hazmat

Và bao nhiêu chi phí này thêm?
hazmat

Câu trả lời:


22

Có lẽ điều này giúp cho câu hỏi đầu tiên:

Nếu bạn biết ID tiến trình (PID) của người dùng cụ thể, bạn có thể nhận giới hạn cho từng quy trình với:

cat /proc/<PID>/limits

Bạn có thể lấy số lượng tệp đã mở cho mỗi PID bằng:

ls -1 /proc/<PID>/fd | wc -l

Và sau đó chỉ cần so sánh giá trị của Max open filesvới số lượng mô tả tệp mở từ lệnh thứ hai để có được tỷ lệ phần trăm.


8

Xuất ra tỷ lệ phần trăm hiện tại của các tệp đang mở, Proc và tín hiệu đang chờ xử lý bằng một số phương pháp và công cụ tiêu chuẩn bất tiện:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

Đầu ra trên hệ thống của tôi:

59%
9%
0%

Giả sử những con số đó là tốt, những gì câu trả lời này cho thấy rằng nó có thể được thực hiện bằng vỏ, nhưng có lẽ không nên, trừ khi có các phương pháp vỏ tốt hơn nhiều. Thay vào đó, Q này sẽ được thực hiện tốt hơn với gcc, hoặc python, v.v.


-4

Ulimits là thuộc tính của các quy trình và được kế thừa cho các quy trình con.

Bạn không thể có được giới hạn cho một quá trình khác.


2
Vô lý. man lsof, man ps, ...
Gilles 'Somali dừng tà ác'

1
Bạn dường như hiểu sai về cách thức hoạt động của UNIX và cách kết quả của nó. lsof đọc bộ nhớ kernel để lấy các giá trị, không có giao diện tài liệu nào được sử dụng bởi lsof, vì vậy lsof sẽ thất bại trong trường hợp ngay cả những thay đổi nhỏ đã được thực hiện đối với cấu trúc dữ liệu kernel bên trong.
schily

2
Đó là một vấn đề đau đầu cho người lsofbảo trì, chắc chắn. Nhưng không liên quan đến người dùng cuối. Cũng không chính xác trong bối cảnh của câu hỏi này, vì nó hỏi cụ thể về Linux, có giao diện tài liệu ( man proc).
Gilles 'SO- ngừng trở nên xấu xa'

Bạn đang nói về các giao diện không có giấy tờ có thể thay đổi mà không cần thông báo trong trường hợp này.
schily

1
Tôi không thể đánh giá thấp nguyên nhân của việc đại diện thấp của mình vì vậy tôi sẽ chỉ nhận xét-1
Zun
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.