db2 list applications サポートツール(前回との比較する編)
db2 list applicationsを行うと、DBに接続に来ているクライアントの
一覧が取れます。
たとえば、こんな感じ。。
$ db2 list applications Auth Id Application Appl. Application Id DB # of Name Handle Name Agents -------- -------------- ---------- -------------------------------------------------------------- -------- ----- DB2INST1 php 39809 192.168.1.32.12707.0805221100 TESTDB 1 DB2INST1 db2bp 38360 192.168.1.32.11678.0805221055 TESTDB 1 DB2INST1 db2jcc_applica 43577 192.168.1.15.15621.08071217221 TESTDB 1 DB2INST1 db2jcc_applica 31386 192.168.1.15.40710.08070913452 TESTDB 1 DB2INST1 httpd 40886 192.168.1.32.37542.0805221103 TESTDB 1 DB2INST1 db2jcc_applica 30615 192.168.1.15.39174.08070913332 TESTDB 1 DB2INST1 php 94 192.168.1.36.5328.08052207435 TESTDB 1 DB2INST1 httpd 41237 192.168.1.21.23779.0805221104 TESTDB 1 DB2INST1 db2jcc_applica 43500 192.168.1.15.14853.08071217202 TESTDB 1
これはいいとして、たぶんDBA的なことをしてると、
このコマンドを定期的に叩いて、「接続しっぱなしのクライアントはどいつだ!」
と犯人探しに躍起になってるかと思います。
でもコマンドを叩いても現状のものが出てくるだけですので
どれがつなげっぱなしかよくわからん・・てなことになったりします。。
自分もその一人・・
で、最近awkをちょっと使い始めたのでこのあたりを解消する
スクリプトを組んでみました。
スクリプトの塊はこんな感じ・・
実際には改行無しの1行になります。
db2 list applications >/tmp/db2listapp2 ; cat /tmp/db2listapp1 > /tmp/db2listapp0 ; echo 'next' >> /tmp/db2listapp0 ; cat /tmp/db2listapp2 >> /tmp/db2listapp0 ; mv /tmp/db2listapp2 /tmp/db2listapp1 ; cat /tmp/db2listapp0 | gawk ' { if($1 == "next" ){ nextflg=1; } if(nextflg != 1) { prevapph[i] = $3; i++; } else { nowline[j] = $0 ; nowapph[j] = $3 ; j++ } } END { for(k=0;k<=j;k++) { flg=" "; for(l=0;l<=i;l++) { if(nowapph[k]==prevapph[l] && k>4){flg=">>>> ";} } if(nowline[k]!="")print flg,nowline[k]; } } '
スクリプトというかなんだかよくわからんお化けコードになってますが
これを実行するたびに前回実行時のlist applicationsと比較して
同じApplication Handleのものがいたら >>>> を行の頭に出すように
してみました。
「db2jcc_applica やらはIBM Data Studioで、コイツはつなげっぱなしだから
>>>>が付いててもOK。
でも、同じく>>>>が付いているhttpd 40886はちょっとくさいな・・要チェックだ!」
ってな考察が出来るようになったりして。。ぁぁ、我ながら超便利(w
Auth Id Application Appl. Application Id DB # of Name Handle Name Agents -------- -------------- ---------- -------------------------------------------------------------- -------- ----- DB2INST1 httpd 42828 192.168.1.21.26343.0805221113 TESTDB 1 >>>> DB2INST1 db2jcc_applica 43577 192.168.1.15.15621.08071217221 TESTDB 1 >>>> DB2INST1 db2jcc_applica 31386 192.168.1.15.40710.08070913452 TESTDB 1 >>>> DB2INST1 httpd 40886 192.168.1.32.37542.0805221103 TESTDB 1 >>>> DB2INST1 db2jcc_applica 30615 192.168.1.15.39174.08070913332 TESTDB 1 DB2INST1 httpd 42608 192.168.1.32.35243.0805221110 TESTDB 1 DB2INST1 httpd 42713 192.168.1.22.1460.08052211134 TESTDB 1 DB2INST1 httpd 43035 192.168.1.22.2484.08052211134 TESTDB 1 >>>> DB2INST1 php 94 192.168.1.36.5328.08052207435 TESTDB 1 >>>> DB2INST1 db2jcc_applica 43500 192.168.1.15.14853.08071217202 TESTDB 1
仕組み的には
list applications の結果を /tmp/db2listapp2 に保存
前回結果として/tmp/db2listapp1が保存されているのでこれを/tmp/db2listapp0にコピー
区切り行として next という行を/tmp/db2listapp0に追記
先ほど保存した/tmp/db2listapp2を/tmp/db2listapp0に追記
/tmp/db2listapp2を前回保存として/tmp/db2listapp1に移動
/tmp/db2listapp0をcatして gawkに渡します。
awkでは、
nextの行がくるまでは前回の結果として3つ目のappl.Handleをprevapph配列に格納
next以降は行とappl.Handleをnowline、nowapphの配列に格納
nowlineに格納した分だけループし、
その内部でnowapph配列とprevapph配列を比較し、ヒットしたら>>>>を表示するようにして、
行表示する
と、まあ、、なんというか、、力技・・・すみません、自分のコーディングスタイルがこんなんなんで・・
まあ、awk初めてまだ2日目なので許してくださいwww
と、こんなコードでもお役に立てれば・・