Bắt cpu sử dụng thời gian thực


11

Khi tôi thực hiện lệnh sau để sử dụng cpu, tôi sẽ sử dụng cpu cho người dùng.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Đầu ra:

14.5

Ở đây tôi gặp vấn đề là đầu ra phụ thuộc vào lệnh trên cùng do đó nó không thay đổi ngay lập tức như lệnh trên. Vì vậy, tôi không nhận được cpu chính xác ngay lập tức. Nó cho đầu ra tương tự và không thay đổi.

Tôi muốn có được sử dụng cpu thời gian thực trong đầu ra. Xin hãy giúp tôi cải thiện mệnh lệnh của tôi.


theo dõi thời gian thực Askubfox.com/questions/293426/
Qasim

Kịch bản bash đơn giản này thực hiện điều đó: Askubfox.com/a/450136/243213
Craig van Tonder

Câu trả lời:


19

Nếu bạn có thể đủ khả năng trì hoãn một giây, điều này sẽ in mức sử dụng CPU dưới dạng phần trăm đơn giản:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Không có độ trễ một giây, vmstatchỉ có thể in các giá trị trung bình kể từ khi khởi động.)


Không cho tôi một% chính xác (so với htop)
lepe

1
Bạn cần sử dụng vmstat 1 2như thế này: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] Nếu không, bạn vmstatsẽ đưa ra các giá trị kể từ khi khởi động có khả năng không phải là những gì bạn đang theo đuổi.
Joe

joe cảm ơn bạn nó hoạt động. Xin vui lòng Paul, chỉnh sửa câu trả lời để mọi người có thể thấy dòng lệnh chính xác
Pavlos Theodorou

Cảm ơn vì đã nắm bắt được điều đó, Joe và Pavlos! Tôi đã không nhận thấy rằng một phần của trang người đàn ông.
Paul

9

Đây là một vấn đề được biết đến với top. Như đã giải thích ở đây , lần lặp đầu tiên top -btrả về tỷ lệ phần trăm kể từ khi khởi động, do đó chúng ta cần ít nhất hai lần lặp ( -n 2) để có được tỷ lệ phần trăm hiện tại. Để tăng tốc mọi thứ, bạn có thể đặt delay giữa các lần lặp thành 0.01. topphân chia việc sử dụng CPU giữa người dùng, quy trình hệ thống và nicequy trình, chúng tôi muốn tổng của ba. Cuối cùng, bạn có grepdòng chứa tỷ lệ phần trăm CPU và sau đó sử dụng gawkđể tính tổng các quy trình của người dùng, hệ thống và tốt đẹp:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

Mọi phương thức khác bao gồm sar, mpstat ... vv đều hiển thị 2/3% trong khi lệnh này luôn hiển thị 50%.
CMCDragonkai

@CMCDragonkai các số sẽ thay đổi (tôi vừa kiểm tra nó) bạn có chắc là bạn sao chép / dán chính xác không? Ngoài ra, lưu ý rằng trên các hệ thống với nhiều CPU, topsẽ báo cáo việc sử dụng% theo phần trăm của một đơn CPU. Điều này có nghĩa là bạn sẽ thường nhận được tỷ lệ phần trăm cao hơn nhiều. Xem điểm 9 tại đây .
terdon

Tôi nghĩ lệnh này có thể không tương thích với hệ thống của tôi. Nhưng rõ ràng là tất cả các phương pháp khác mà tôi đã thử đều mang lại cho tôi tỷ lệ phần trăm 1/2/3%, đó là những gì tôi thấy nếu tôi chạy htop, trong khi lệnh này mang lại cho tôi sự bất thường.
CMCDragonkai

@CMCDragonkai đó là vì nhiều CPU. Bạn có thể lấy số được trả về bởi số này và chia cho số lõi hoặc bạn có thể sử dụng toptrong chế độ tương tác (chỉ cần chạy top) và, khi đó, nhấn I(shift + i) để xem phân tích theo lõi.
terdon

Tôi chỉ có 1 CPU.
CMCDragonkai

7

Tôi đã thử một vài cách, nhưng điều này đối với tôi chính xác nhất:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'

Có nó từ đây


linux của tôi (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sat 19 tháng 5 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) không có cột $ 15 (dòng cpu của tệp / Proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
Câu trả lời tốt nhất! Cảm ơn! Biến thể của tôi: cat <(grep 'cpu' / Proc / stat) <(ngủ 0.1 && grep 'cpu' / Proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

Sự khác biệt của maXp là nó được in tròn với một số thập phân duy nhất: %.1ftheo ý kiến ​​của tôi là dễ đọc và hữu ích hơn nếu bạn sử dụng đầu ra đó trong các tập lệnh khác.
Lepe

0

Sử dụng -n2. Điều này sẽ xuất ra hai dòng. Lần đầu tiên topin dòng không đủ điều kiện cho tiểu bang tại thời điểm đó. Sau đó điều chỉnh tập lệnh của bạn để bỏ qua dòng đầu tiên.

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.