はじめに
こんにちは!
JP1を利用している際、呼び出した処理の結果によってジョブの正常終了/異常終了を判定させることがあります。
プロジェクトによってどのような形式で処理の結果を返すかはそれぞれだと思うのですが、多くの場合は単純にリターンコードを返しているのではないでしょうか?
0:正常終了 9:異常終了 1:警告終了 みたいな。
そんな中、「JSONで返されることになったけど、どうやって処理結果を取ればいいの?」と詰まった方いませんか?
この記事は次のことが知りたい方へ向けた内容となっています!
・JSON形式のデータから値を取得する方法
・JP1で呼び出した処理結果でジョブの正常終了/異常終了を判断する方法
筆者について
弊社運用保守チームに所属しています。
これまで数多くのプロジェクトに携わってきた中で、JP1やSystemWalkerといったジョブ管理のツールを使った経験があります。
この度、当記事のような仕様で処理結果の判定を対応したため、備忘の意味も含め残しておきます。
JP1って?
ここでは簡単に触れておくだけにしておきます。
JP1とは、日立製作所が開発・販売している、企業のITシステムの運用管理ソフト。IT資産の管理や稼動状況の把握、定型業務の自動化、セキュリティ対策などを統合的に行うことができる。1台から数千台まで様々な規模のシステムに導入することができ、必要に応じて拡張していくことができる。
引用元:IT用語辞典 e-wordsより
色々機能がありますが、「ジョブ管理」で使うことが多いかと思います。
“タスクスケジューラやcronが発展したツール”と考えるとわかりやすいかもしれません。
スケジューリングされた処理をいくつも順序をつけて起動することができたり、Windows・Linuxといった異なるプラットフォームにまたがった処理も連動させることができます。
処理結果の判定
結論から書くと、JSON形式の戻り値でジョブの正常終了/異常終了を判定するのは次の方法で可能です。
- jqコマンドを使って、JSONから”処理結果”の値を取得する
- 取得した値を必要に応じJP1の終了コードに変換する
これだけでOKです!
前提としては、JSONのどの値を処理結果として扱うのか、プロジェクトで先に決めておきましょう。
なお、JP1では「0:正常終了」「0以外:異常終了」としています。
jqインストール
jqとはJSONから値を抜き出したり、集計、整形などができるツールです。
https://stedolan.github.io/jq/
マニュアルはこちら。
http://stedolan.github.io/jq/manual/
まずは処理を呼び出す環境にjqをインストールし使えるようにします。
CentOSだと以下のように2行のコマンドだけでさくっとインストール完了です。
$ sudo yum -y install epel-release
$ sudo yum -y install jq
Windowsの場合は公式ページからexeファイルをダウンロードし、環境変数Pathにexeを配置したフォルダを追加してあげればOKです。
jqインストールや使用方法の詳細については、他に紹介しているサイトがあるので気になった方は探してみてください。
今回のサンプル
次は実際にJSONから値を取得する方法です。
ここでは以下の例を使います。
- JP1ジョブからshellでバッチ処理呼び出しを行う
- バッチ処理はPythonで実装。戻り値をJSON形式で返す
- shellは戻り値のJSONから処理結果を取得し、JP1の終了コードに変換する
- 変換された終了コードでJP1は正常/異常終了を判定する
test.sh
#!/usr/bin/env bash
#実行するバッチ処理
RUN="python3 test.py"
#バッチ実行→戻り値のJSONからstatus取得
STATUS=$(${RUN} | jq -r '.status')
#ステータス判定
if [ "$STATUS" = "True" ]; then
exit 0
else
exit 9
fi
test.py
import json
JSON_DEMO = '{"message":"null","result":[{"address1":"東京都","address2":"新宿区","address3":"新小川町","kana1":"トウキョウト","kana2":"シンジュクク","kana3":"シンオガワマチ","prefcode": "13","zipcode": "1620814"}],"status":"True"}'
data = json.loads(JSON_DEMO)
print(json.dumps(data, indent=2))
JP1のジョブ定義
JP1のジョブ定義
test.shの以下でjqを使用してJSONから値を取得しています。
#バッチ実行→戻り値のJSONからstatus取得
STATUS=$(${RUN} | jq -r '.status')
バッチの戻り値JSONをjqコマンドの標準入力として渡してあげます。
「’.status’」でJSONの中から「status」の値を取得できます。
最初の「.」はルートを意味しており、続けてプロパティーを指定することで、その値が出力される仕組みです。
またオプションの「-r」は、結果が文字列の場合にJSON形式ではなく、文字列を直接出力してくれるものです。
今回の場合、「”status”:”True”」をオプション無しで取得すると「”True”」となります。
取得後にステータス判定をする際、ダブルクォートが邪魔なのでオプションを指定して文字列「True」として出力しています。
取得した値で処理結果を判定
前述した通り、JP1では終了コードが「0:正常終了」「0以外:異常終了」となっています。
なので例えば、取得したstatusが「True」の場合0、それ以外は9を終了コードとするように分岐させてあげればOKです。
問題なく実装されていると、こんな感じでジョブの実行結果を判定することができます。
“status”:”True“の場合
JP1 ジョブ実行結果
“status”:”False“の場合
JP1 ジョブ実行結果
まとめ
いかがだったでしょうか?
JP1はネットに情報があまりなく、公式ページにあるマニュアルもかなりのボリュームなので、欲しい情報を探すことが大変な場合がたびたびあります。
今後も構築・設定時に手こずった点や、マニュアルから読み解くのが難しい手順など、同じように困った方の役に立つ記事を残していければと思います!