Làm cách nào để theo dõi việc sử dụng CPU của người dùng?


15

Tôi cần theo dõi việc sử dụng CPU của người dùng hai máy chủ (Ubuntu và CentOS). Ví dụ:

user1     5%
user2    10%
...

Có một công cụ tương tự tophoặc htopcó thể làm điều đó?


Bạn có cần top để được hiển thị trong thời gian thực? Mặt khác, bạn có thể xem xét top -u uservà chuyển hướng kết quả đến một tệp, sau đó theo dõi người dùng khác. sau đó bạn sẽ có một màn hình sử dụng Proc cho người dùng của bạn trong một khoảng thời gian nhất định.
Laurent C.

Khi bạn nói giám sát trong khoảng thời gian nào? Thỉnh thoảng hay liên tục?
slm

Tôi hy vọng có thể theo dõi người dùng trong thời gian thực như đầu trang.
Amged Rustom

Câu trả lời:


17

Dưới đây là tập lệnh để in tổng mức sử dụng CPU cho mỗi người dùng hiện đang đăng nhập , showPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(who | awk '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

Và đây là một phiên bản sửa đổi một chút để in mức sử dụng CPU của tất cả người dùng có sẵn (nhưng bỏ qua những người có mức sử dụng CPU bằng 0), showAllPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

Cột đầu tiên đại diện cho tên người dùng, cột thứ hai sử dụng CPU tổng hợp và cột thứ ba sử dụng CPU được chuẩn hóa theo số lượng lõi CPU.

Ngoài ra còn có một tập lệnh liên quan để hiển thị tổng mức sử dụng bộ nhớ cho mỗi người dùng: showPerUserMem.sh

Để giám sát trực tiếp, chỉ cần thực hiện các tập lệnh này định kỳ thông qua watchlệnh.

Để sắp xếp theo cách sử dụng CPU, dẫn đầu ra sort -k2 -nr.


1
tại sao bạn trộn biến bash env với biến script có nghĩa là $ USER đã tồn tại, thậm chí tất cả các biến mũ đều là env phải không?
Rahul Patil

Tôi không nghĩ rằng tất cả các biến chữ hoa phải là biến môi trường. Nhưng tôi đồng ý rằng việc ghi đè các biến đã có sẵn không phải là một phong cách rất hay.
SCAI

1
Nói chung, đó là một ý tưởng tồi để sử dụng UPPERCASE trong bash, vì lý do mà Rahul đã đề cập. Thậm chí còn tệ hơn khi bạn đang sử dụng một tên biến đã tồn tại dưới dạng tên môi trường (n bash, đã $USERlà tên người dùng của bạn, vì vậy giống như id -nulệnh bạn đang sử dụng. Tôi đã chỉnh sửa bài đăng của mình để thay đổi điều này.
terdon

Sử dụng các biến chữ hoa trong shell script chắc chắn không phải là ý tưởng tồi vì chín trong số mười script trong /etc/init.d/thư mục của tôi cũng đang làm điều này. Ghi đè các biến môi trường hiện tại ngược lại nên tránh.
SCAI

1
Tôi đã thêm một phiên bản để bao gồm mọi người dùng, không chỉ những phiên bản hiện đang đăng nhập.
scai 21/03 '
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.