oom-killerが発生している付近のログを調べるためにシェルを作成する。
以前インストールした「logwatch」https://brokendish.org/debian/1370/で「oom-killer」が出ていることは確認できるけど、
実際の原因までは解らないので、各種ログの情報を収集してみていくことにしてみる。
今回調査するログはApacheのアクセスログで、oom-killerが発生する前にApacheがどんな状態であるのかを調査してみようと思う。
多分、このシェルを元にして他のログファイルの調査をすることになると思う。
今回やること
- kern.logからoom-killerが発生した時間を取得する
- 取得した時間を検索しやすいようにApacheのログファイル形式の時間フォーマットに整形する
- ※注意:kern.logには年(YYYY)の情報はないので一律「date +%Y」で今年にしてしまう。
- Apacheログファイルをアーカイブ含めて全部収集し、1ファイルにする
- 入力した文字をegrepの引数にして1ファイルにまとめたログから検索する
- これらの処理をシェルにする
oom-killer-seek.sh
#!/bin/bash echo "oom-killの発生時間をkern.logから検出します" #[kern.logから「oom-kill」を探してその発生日時(Jan 1 01:05:01)をApacheのログファイルの日時(01/Jan/2012:01:04:55)に整形する] export LOGyyyy=`date +%Y` grep -h oom-kill /var/log/kern.log*|awk 'begin{FS=" "}{printf ("%02d/%s/%s:%s\n",$2,$1,ENVIRON["LOGyyyy"],$3)}end{}'|sort #結果フォーマット(Apacheのログファイル形式) #01/Jan/2012:01:05:01 #Apacheログの収集※僕の場合は定時刻に収集しているのでコメントアウト #zcat /var/log/apache2/access.log.*.gz > /var/log/apache2/access_all.log #cat /var/log/apache2/access.log >> /var/log/apache2/access_all.log echo "------------------------------------------------------------------------------------------" echo "入力値をaccess_all.logから検出します。日時を入力してください(ex) 01/Jan/2012:01:0[234])" echo "------------------------------------------------------------------------------------------" echo "※ここで入力した文字列をegrepするだけなので日時じゃなくても大丈夫!" echo " " echo "ex IPアドレスで検索する場合) xxx.xxx.xx.xxx" echo "ex 正規表現を使用する1) xxx.xxx.xxx.xxx.+themes/ModernStyle" echo " 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「themes/ModernStyle」を含む行を抽出" echo " " echo "ex 正規表現を使用する2) xxx.xxx.xxx.xxx.+Dec.+themes/ModernStyle" echo " 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「Dec」AND「themes/ModernStyle」を含む行を抽出" echo "------------------------------------------------------------------------------------------" echo "<<<" #標準入力からの値を取得 read red if [ "$red" != "" ] then echo "$redで検索します" egrep "$red" /var/log/apache2/access_all.log echo '-----------------------------------------------------------' echo `egrep $red /var/log/apache2/access_all.log|wc -l`件 echo '-----------------------------------------------------------' else echo "入力がありません。処理を終了します。" fi |
実行:
sh oom-killer-seek.sh oom-killerの発生時間をkern.logから検出します 30/Dec/2012:19:04:06 30/Dec/2012:19:04:07 30/Dec/2012:19:04:09 30/Dec/2012:19:04:11 01/Jan/2012:01:05:01 ------------------------------------------------------------------------------------------ 入力値をaccess_all.logから検出します。日時を入力してください(ex) 01/Jan/2012:01:0[234]) ------------------------------------------------------------------------------------------ ※ここで入力した文字列をegrepするだけなので日時じゃなくても大丈夫! ex IPアドレスで検索する場合) xxx.xxx.xx.xxx ex 正規表現を使用する1) xxx.xxx.xxx.xxx.+themes/ModernStyle 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「themes/ModernStyle」を含む行を抽出 ex 正規表現を使用する2) xxx.xxx.xxx.xxx.+Dec.+themes/ModernStyle 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「Dec」AND「themes/ModernStyle」を含む行を抽出 ------------------------------------------------------------------------------------------ <<< 01/Jan/2012:01:0[234] 01/Jan/2012:01:0[234]で検索します : : xxx.xx.xx.xx - - [01/Jan/2012:01:04:55 +0900] "GET /ubuntu/681/ HTTP/1.1" 200 15042 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" xxx.xx.xx.xx - - [01/Jan/2012:01:04:55 +0900] "GET /ubuntu/825/ HTTP/1.1" 200 15042 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/1.1; +http://flipboard.com/browserproxy)" : : ----------------------------------------------------------- 38件 ----------------------------------------------------------- |
実行時の説明:
01/Jan/2012:01:05にoom-killerが出たので
01/Jan/2012:01:0[234]で「01/Jan/2012:01:02」、「01/Jan/2012:01:03」、「01/Jan/2012:01:04」
に起きたことを調べる。必要であればもっと前に遡って調べるべし。
その他の使い道
例:12月のアクセスログに「ubuntu」を含むものを確認
実行:
sh oom-killer-seek.sh oom-killerの発生時間をkern.logから検出します 30/Dec/2012:19:04:06 30/Dec/2012:19:04:07 30/Dec/2012:19:04:09 30/Dec/2012:19:04:11 01/Jan/2012:01:05:01 ------------------------------------------------------------------------------------------ 入力値をaccess_all.logから検出します。日時を入力してください(ex) 01/Jan/2012:01:0[234]) ------------------------------------------------------------------------------------------ ※ここで入力した文字列をegrepするだけなので日時じゃなくても大丈夫! ex IPアドレスで検索する場合) xxx.xxx.xx.xxx ex 正規表現を使用する1) xxx.xxx.xxx.xxx.+themes/ModernStyle 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「themes/ModernStyle」を含む行を抽出 ex 正規表現を使用する2) xxx.xxx.xxx.xxx.+Dec.+themes/ModernStyle 説明:IPアドレス「xxx.xxx.xxx.xxx」AND「Dec」AND「themes/ModernStyle」を含む行を抽出 ------------------------------------------------------------------------------------------ <<< .+Dec.+GET.+ubuntu.+ .+Dec.+GET.+ubuntu.+で検索します : : xx.xx.xx.xx - - [31/Dec/2011:23:59:34 +0900] "GET /xx/xxx/xx/xx/xx.css HTTP/1.1" 200 998 "https://brokendish.org/ubuntu/825/" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/x.x.x.xx Safari/535.7" ----------------------------------------------------------- 67558件 ----------------------------------------------------------- |