LoginSignup
0
1

More than 5 years have passed since last update.

ログローテ用のリソース取得スクリプト(top)

Last updated at Posted at 2018-04-20

こんにちは。

/etc/cron.dを使って定期的にリソース取得し、ローテーションも行えるようにスクリプトを組んでみました。簡単ですが、top -Hを使ったことがなかったので備忘録として記事にしておきます。

【スクリプトの説明】

まず/var/log傘下にprocessディレクトリを作成しておきます。

mkdirで作成
mkdir /var/log/process

そして/usr/local/bin/にprocessというファイルをviで新規作成し、以下のスクリプトを組みます。

/usr/local/bin/process
#!/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の結果を指して一行で結果をログを出すようにしています。

awkでの時間表示
top -b -H -n 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S"), $0}'

結果ログ例は以下の通りです。

top.log
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分毎に実行されるように編集しました。

/etc/cron.d/process
#!/bin/bash
*/1 * * * * root /usr/local/bin/process

あとはcron.d_serviceを再起動し、自動起動設定しておけば準備完了です。
 ※詳細は上記URLを参考にしてください。

簡単ですが以上です。

なにかありましたらコメントから宜しくお願い致します。

0
1
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
0
1