要求する
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は正しい結果を得ました。
拡張と要約
- このIBMMQ管理と同様のスクリプトを作成するには、IBMMQコマンドに精通している必要があります。
- 機能設計を使用すると、読者は、作成者の不足している機能など、より多くの機能を簡単に拡張できます。QMのステータスを取得します。