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}
しておきましょう。