LoginSignup
2
3

More than 3 years have passed since last update.

【備忘録】特定のプロセスのCPU使用率をwhileループで確認するシェルスクリプト

Last updated at Posted at 2020-05-25

0.はじめに

プロセス監視をtopコマンドで定期的に行うために作ったシェルスクリプトを共有します。
具体的には、topコマンドの実行結果をlogファイルにwhileループで出力し続けるという、シンプルなものです。

1.検証環境など

  • ローカルpc
    • ubuntu20.04

2.topコマンドの実行結果

まず、シェルスクリプトにするtopコマンドの実行結果をサンプルとして共有します。

$ top -n 1
top - 00:58:08 up 55 min,  1 user,  load average: 0.67, 0.58, 0.64
Tasks: 329 total,   1 running, 328 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.6 us,  0.8 sy,  0.0 ni, 93.1 id,  0.0 wa,  0.0 hi,  1.5 si,  0.0 st
MiB Mem :  15662.8 total,   9716.0 free,   2467.8 used,   3478.9 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  11582.7 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                             
   9095 gkz       20   0 4616108 107196  70536 S  25.0   0.7   0:00.37 chrome                                                                                                                              
   2487 gkz       20   0 4730532 335940 156620 S   6.2   2.1   2:42.61 gnome-shell                                                                                                                         
   4102 gkz       20   0  321656  12708  11268 S   6.2   0.1   0:05.56 ibus-engine-moz                                                                                                                     
   7243 gkz       20   0  961388  52248  37448 S   6.2   0.3   0:05.53 gnome-terminal-                                                                                                                     
      1 root      20   0  168164  11936   8272 S   0.0   0.1   0:10.67 systemd    

topコマンドはnオプションを使うことで画面(フレーム?)の更新回数を制限することが可能です。
本記事では任意のプロセスのCPU使用率を定期的に監視するため、パイプでtopコマンドの結果を渡し、grepで特定のプロセスの出力結果のみ絞ることとします。

3.ソースコード

toploop.sh
#!/bin/bash

# debug mode
# bash -x toploop.sh $process

# your monitored process, e.g. dockerd
process=$1

starttime=`date +"%Y%m%d_%H%M%S"`
filename=`echo "log/top.log.$process.$starttime"`

while true
do
  sleep 5
  output=`top -n 1| grep $process`
  val=`echo $output | awk '{print $13}'`
  if [ "$val" == "$process" ]; then
    num=`echo "$output" | grep -oP "[S|R]\s+[0-9]*[.]?[0-9]" | awk '{print $2}'`
    date +"%Y%m%d_%H%M%S" >> $filename
    echo "$process:  $num%" >> $filename
  else
    date +"%Y%m%d_%H%M%S" >> $filename
    echo "$process: notfound" >> $filename
  fi
done

4.実行方法

4-1.コマンドの末尾に&をつけてバッググラウンドでコマンドを実行

$  . toploop.sh chrome&
[1] 11175

4-2.シェルスクリプトを実行した後、tailコマンドでログファイルの更新を追う

※シェルスクリプトではlogファイル名のフォーマットをtop.log.${process}.${starttime}としています。

$ tail -f log/top.log.chrome.20200526_011531
20200526_011602
chrome: notfound
20200526_011608
chrome:  6.2%

※プロセス監視が終わったら、4-1で実行したシェルスクリプトの実行プロセスを忘れずにkill ${bashのPID}しておきましょう。

5. 参考

P.S. Twitterもやってるのでフォローしていただけると泣いて喜びます:)

@gkzvoice

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3