こんにちは。
/etc/cron.dを使って定期的にリソース取得し、ローテーションも行えるようにスクリプトを組んでみました。簡単ですが、top -Hを使ったことがなかったので備忘録として記事にしておきます。
【スクリプトの説明】
まず/var/log傘下にprocessディレクトリを作成しておきます。
mkdir /var/log/process
そして/usr/local/bin/にprocessというファイルをviで新規作成し、以下のスクリプトを組みます。
#!/bin/bash
### 設定値
GENERATION=7
PROCDIR=/var/log/process
### フォルダ作成
DATE=`date "+%Y%m%d"`
if [ ! -d $PROCDIR/$DATE ] ; then
mkdir $PROCDIR/$DATE > /dev/null
fi
### topをスレッド分まで取得しておくこと
top -b -H -n 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S"), $0}' >> $PROCDIR/$DATE/top.log
### ログローテーション
NUM_DIR=`ls -d $PROCDIR/* | wc -l`
if [ $NUM_DIR -gt $GENERATION ] ; then
FILE=`ls -d $PROCDIR/* | head -1`
rm -rf $FILE
fi
ポイントとしては以下のところです。
1. top -HでスレッドごとにCPU使用率などを確認可能
障害中にtopコマンドでリソース確認するとたまにひとつのプロセスで400%までCPU使用率が上がっていることがあります。これはtopコマンドがプロセスごとに出しているためです(具体的にはjavaとかは100%超えたりします)。top -Hで出せばスレッドごとに出力できるため400%だったのが4つのスレッドに分かれて100%ずつになったりするので正確にリソースを視認できるようになります。
2. awkで行ごとに日付と時刻を挿入
awkはstrftime( 書式文字列 [, 時刻] )
で時刻を文字列に変換できます。さらに$0でtopの結果を指して一行で結果をログを出すようにしています。
top -b -H -n 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S"), $0}'
結果ログ例は以下の通りです。
top - 22:16:33 up 5 days, 22:18, 2 users, load average: 0.08, 0.04, 0.05
Threads: 248 total, 1 running, 247 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 3.0 sy, 0.0 ni, 90.9 id, 3.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999720 total, 99196 free, 529668 used, 370856 buff/cache
KiB Swap: 1572860 total, 1426708 free, 146152 used. 221592 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2018/04/20 21:57:01 28349 apache 20 0 577940 16668 5648 S 0.0 1.7 0:00.37 httpd
2018/04/20 21:57:01 28362 apache 20 0 577940 16356 5440 S 0.0 1.6 0:00.21 httpd
2018/04/20 21:57:01 28384 root 20 0 126236 1604 984 S 0.0 0.2 0:00.00 crond
2018/04/20 21:57:01 28435 apache 20 0 577940 16668 5648 S 0.0 1.7 0:00.31 httpd
2018/04/20 21:57:01 28445 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kworker/0:2
2018/04/20 21:57:01 28447 apache 20 0 577940 16296 5400 S 0.0 1.6 0:00.11 httpd
2018/04/20 21:57:01 28482 apache 20 0 470844 8244 2024 S 0.0 0.8 0:00.00 httpd
2018/04/20 21:57:01 28532 apache 20 0 470844 8244 2024 S 0.0 0.8 0:00.00 httpd
あとはchmod +x /usr/local/bin/process
で実行権限をつけておいてください。
ログローテーションは7日分が残るようにしてあります。
【cron.dに登録】
rootでログインした状態で/etc/cron.dディレクトリ傘下へ移動し、processというファイルを作成します。ここでcronをrootで動かすように設定します。設定の仕方は以下のURLを参考にしました。詳細に記載して頂いておりとても助かりました。ありがとうございます。
■/etc/crontabと/etc/cron.d設定ファイルの書き方
私は以下の通りに1分毎に実行されるように編集しました。
#!/bin/bash
*/1 * * * * root /usr/local/bin/process
あとはcron.d_serviceを再起動し、自動起動設定しておけば準備完了です。
※詳細は上記URLを参考にしてください。
簡単ですが以上です。
なにかありましたらコメントから宜しくお願い致します。