Linux実用スクリプト4:IBMMQ内のすべてのキューメッセージの深さをバッチで取得します

要求する

         IBM MQサーバーがあります。リモート災害復旧切り替えを実行するときにメッセージが失われないようにするには、切り替え前のQMメッセージがあるかどうかを確認する必要があります。単一のサーバーではQMが多く、QUEUEの内部では、必要に応じてログインして肉眼で表示するため、非常に非効率的です。したがって、この需要があります。

解決

#!/bin/bash
 
#param1: mq_name
#param2: qlocal
GetQueueDepth()
{
    if [ $# != 2 ]
    then
        echo "Usage : FUNCTION QMNAME QLOCAL"
        return 1
    fi
    QMNAME="$1"
    QLOCAL="$2"
    AAA=`runmqsc $QMNAME <<!
       display qlocal($QLOCAL)
       end
!`
    echo ${AAA#*CURDEPTH} | awk '{print $1}' | cut -d '(' -f2|cut -d ')' -f1
}
 
GetAllQM()
{
    AAA=`dspmq`
    for item in $AAA
    do 
        PREFIX=${item:0:6}
        if [ "$PREFIX" = "QMNAME" ]
        then
            echo ${item#*QMNAME} | cut -d '(' -f2|cut -d ')' -f1
        fi
    done
}
 
GetAllQueue()
{
    if [ $# != 1 ]
    then
        echo "Usage : FUNCTION QMNAME"
        return 1
    fi
    QMNAME="$1"
    AAA=`runmqsc $QMNAME <<!
       display qlocal(*)
       end
!`
    for item in $AAA
    do
        PREFIX=${item:0:5}
        if [ "$PREFIX" = "QUEUE" ]
        then
             QUEUENAME=`echo ${item#*QUEUE} | cut -d '(' -f2|cut -d ')' -f1`
             QUEUE_PREFIX=${QUEUENAME:0:6}
             if [ "$QUEUE_PREFIX" != "SYSTEM" ]
             then
                echo "$QUEUENAME"
             fi
        fi
    done
}
 
 
###############main function####################
#QMNAME="QM_TEST"
#QLOCAL="Q.DTS.REQU"
 
LOGFILE=./CHECK_QM.log
> $LOGFILE
 
ALLQM=$(GetAllQM)
for QMNAME in $ALLQM
do
    echo -e "------------------------------" |  tee -a $LOGFILE
    echo -e "Current QM : $QMNAME   \n"      |  tee -a $LOGFILE
    ALLQUEUE=$(GetAllQueue $QMNAME)
    for queuename in $ALLQUEUE
    do
        DEPTH=$(GetQueueDepth $QMNAME $queuename)
        if [ "X$DEPTH" != "X0" ]
        then
            echo -e "\t!!![ATTENTION] The ($QMNAME:$queuename) depth is : $DEPTH" |  tee -a $LOGFILE
        else
            echo -e "\t The ($QMNAME:$queuename) depth is : $DEPTH" |  tee -a $LOGFILE
        fi
    done
    echo -e "------------------------------\n"  |  tee -a $LOGFILE
done
 
echo "Successfully............"

詳細なソリューション

1.現在のサーバー上のすべてのQM (キューマネージャー)を取得します    

関数GetAllQM()の使用現在のサーバーQMのすべてを取得しますdspmqコマンドが主に使用され、コマンドの出力が傍受されます。ここで猫のコマンドは:

-b  :バイト単位で分割します。 -n フラグも指定されていない限り、これらのバイト位置はマルチバイト文字の境界を無視します バイト 

-c  :文字単位で分割します。char  

-d  カスタム区切り文字。デフォルトはタブ文字です。定義する  

-f  -dと一緒に使用し、表示する領域を指定します。フィールド   は通常、区切り文字の後のを指定するために使用されます   

-n  :分割されたマルチバイト文字をキャンセルします。 -b フラグとともにのみ使用されます。文字の最後のバイトが -b フラグの List パラメーターで示される範囲内にある
場合、文字は書き出されます。そうでない場合、文字は除外されます。

著者は、インターネットで検索するためにcut -d '(' -f2 | cut -d ')'-f1 を使用しました。特定の要件は、括弧内のコンテンツを抽出することです。

-d は区切り文字を指定し、-f は取得するフィールドを指定ます

ここでは、最初に左括弧に従って分割し、最初に2番目のフィールドを取得し、次に右括弧で除算し、最初のフィールドを取得し、括弧内のコンテンツを抽出しますこの効果を達成できるより良い正規表現スキームがあるかもしれません。しかし、作者は正規表現についての深い知識がなく、それを実現できませんでした。

2.取得のすべてのキューQM GetAllQueueを    

1の結果によると、呼び出し元の関数は特定のキューのすべてのキューを取得します主に2つのコマンドが使用されます。

runmqsc XXX
display qlocal(*)

1同様にdisplay qlocalの戻りがインターセプトされ、「SYSTEM」で始まるドッキング除外されます(システムプリセットキューに属します)。

3.キューの深さを取得しますGetQueueDepth    

この関数は、表示qlocal(XXX)を使用して、入力パラメーター1(QMおよび入力パラメーター2(QLOCALに従ってキューの特定の情報取得します同様に、戻り値がインターセプトされ、特定のキューの深さが取得されました。

4.結果出力    

結果を端末に出力することに加えて、作成者は、永続的なストレージのためにtee介して結果を関連ファイルにリダイレクトしました。

運転結果

上記のように、QMステータスが異常であるためQM_SDRおよびQM_RCVはキュー情報を取得できませんでしたQM_T24HK_EXTは正しい結果を得ました。

拡張と要約

  1. このIBMMQ管理と同様のスクリプトを作成するには、IBMMQコマンドに精通している必要があります。
  2. 機能設計を使用すると、読者は、作成者の不足している機能など、より多くの機能を簡単に拡張できます。QMのステータスを取得します。

 

おすすめ

転載: blog.csdn.net/zhaogang1993/article/details/108544726