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


と、こんなコードでもお役に立てれば・・