ユーザーごとにCPU使用率を監視するにはどうすればよいですか?


15

2つのサーバー(UbuntuとCentOS)のユーザーによるCPU使用率を監視する必要があります。例えば:

user1     5%
user2    10%
...

それに似たツール、topまたはhtopそれを実行できるツールはありますか?


topをリアルタイムで表示する必要がありますか?それ以外の場合はtop -u user、結果を考慮してファイルにリダイレクトし、別のユーザーを監視できます。その後、特定の間隔でユーザーのproc使用状況を監視します。
ローランC. 14年

どの期間にわたってモニターと言うのですか?時々または連続して?
slm

topのようにリアルタイムでユーザーを監視できるようにしたいと思っています。
修正されたRustom 14年

回答:


17

ここで印刷するためのスクリプトです合計各ユーザーのCPU使用率現在ログインして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; }'

そして利用可能なすべてのユーザーのCPU使用率を印刷するためにわずかに変更されたバージョンがあります(ただし、CPU使用率がゼロのユーザーはスキップします)、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; }'

最初の列はユーザ​​ー名、2番目の列はCPU使用率の合計、3番目の列はCPUコアの数に応じて正規化されたCPU使用率を表します。

各ユーザーの合計メモリ使用量を表示するための関連スクリプトもあります:showPerUserMem.sh

ライブ監視の場合は、watchコマンドを介してこれらのスクリプトを定期的に実行するだけです。

CPU使用率でソートするには、出力をにパイプしますsort -k2 -nr


1
なぜbash env変数とスクリプト変数を混合しているのは、$ USERがすでに存在していることを意味し、すべてのcaps変数がenvであるということです。
ラーフルパティル14年

すべての大文字変数が環境変数である必要はないと思います。しかし、私はすでに既存の変数を上書きすることは非常に素晴らしいスタイルではないことに同意するものとします。
scai 14年

1
ラーフルが言及したことを理由、bashで大文字を使用することが一般的に悪い考えです。それはあなたが変数名を使用しているときということでも悪いことですでに、環境1(nはbashのように存在する$USERUTは同じですので、すでにユーザー名でid -nu使用しているコマンドを、私はこれを変更するにはあなたのポストを編集した。。
terdon

シェルスクリプトで大文字の変数を使用することは、/etc/init.d/ディレクトリ内の10個のスクリプトのうち9個がこれを行っているため、間違いなく悪い考えではありません。対照的に、既存の環境変数を上書きすることは避けてください。
scai

1
私は、インクルードするバージョンを追加すべてのユーザー、現在ログインしていないものだけを。
SCAI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.