【Hinemos 5.0】特定のジョブの実行結果をコマンドで取得する(その1の補足)

前回の記事で、ジョブの起動コマンドの戻り値を取得する方法をご紹介しましたが、実は、一点ほど困った問題があります。

対象のジョブを、スコープを指定して複数のノードで実行した場合に、前回ご紹介したコマンドラインツール(Job_getNodeDetailList.py)は、以下のような情報を出力します。

[root@nodexxx hinemos_command_line]# ./Job_getNodeDetailList.py \
> -H http://127.0.0.1:8080/HinemosWS/ -U hinemos -w hinemos \
> -S 20161129102740-000 -J JU_TEST -I JB_TEST
[(jobNodeDetail){
   endDate = "2016/11/29 10:27:41.707"
   endValue = 12
   facilityId = "nodexxxalt"
   message = "[2016/11/29 10:27:41] stdout=, stderr=
[2016/11/29 10:27:41] コマンド終了待ち
[2016/11/29 10:27:40] エージェント応答待ち"
   nodeName = "nodexxxalt"
   startDate = "2016/11/29 10:27:41.629"
   status = 300
 }, (jobNodeDetail){
   endDate = "2016/11/29 10:27:41.640"
   endValue = 12
   facilityId = "nodexxx"
   message = "[2016/11/29 10:27:41] stdout=, stderr=
[2016/11/29 10:27:41] コマンド終了待ち
[2016/11/29 10:27:40] エージェント応答待ち"
   nodeName = "nodexxx"
   startDate = "2016/11/29 10:27:41.523"
   status = 300
 }]

http://127.0.0.1:8080/HinemosWS/, getNodeDetailList succeeded.

ご覧のとおり、endValueが2ヶ所あります(いうまでもなく、ジョブの実行ノード数と同じです)。つまり、単純にgrepすると、endValueが2行ヒットしてしまい、正しい戻り値が取得できないということになります。これは困りました…

解決策

今のところ、3とおりの解決策が考えられます。

  1. endValueを取得する正規表現を修正する
  2. コマンドラインツールの出力を自前で解析し、オブジェクトとして利用する
  3. コマンドラインツールを改造し、出力前のオブジェクトを取得して利用する

今回は、最も単純な1.の方法で対処してみます(2.と3.については、機会があればご紹介します)。

まず前回ご紹介した、endValueの数字を取り出すコマンド全体を再掲します(セッションIDのみ、今回のものに変えています)。

./Job_getNodeDetailList.py \
-H http://127.0.0.1:8080/HinemosWS/ -U hinemos -w hinemos \
-S 20161129102740-000 -J JU_TEST -I JB_TEST \
| grep endValue | perl -pe 's/\A\s+endValue = (\d+)\b.+\z/$1/ms'

このまま実行すると、1212という出力が得られます。もちろん、これは正しくない値です。

Job_getNodeDetailList.pyの出力内容をみると、

   endValue = 12
   facilityId = "nodexxxalt"
   (省略)
   endValue = 12
   facilityId = "nodexxx"

のように、endValueの次の行に、ジョブ実行ノードのファシリティIDが出力されていることが分かります。ということは、Job_getNodeDetailList.pyの出力を丸呑みしたうえで、上記のパターンを指定すれば良さそうです。

[root@nodexxx hinemos_command_line]# ./Job_getNodeDetailList.py \
> -H http://127.0.0.1:8080/HinemosWS/ -U hinemos -w hinemos \
> -S 20161129102740-000 -J JU_TEST -I JB_TEST \
> | perl -0pe 's/\A.+\s+endValue = (\d+)\n\s+facilityId = "nodexxx".+\z/$1/ms'
12(改行なし)

想定どおり、正しい戻り値(12)が取得できました。

それでは、上記のコマンドを後続ジョブの起動コマンドに当てはめてみます。なお、ジョブ実行ノードのファシリティIDの部分は、#[FACILITY_ID]というジョブ変数に置き換える必要があります。起動コマンドの例は以下のとおりです(実際には1行で記述します。なお、エラー処理等は全く考慮していませんので、あくまでサンプルとしてご覧ください)。

echo `/opt/hinemos_command_line/Job_getNodeDetailList.py 
-H http://127.0.0.1:8080/HinemosWS/ -U hinemos -w hinemos 
-S #[SESSION_ID] -J JU_TEST -I JB_TEST | perl -0pe 
's/\A.+\s+endValue = (\d+)\n\s+facilityId = "#[FACILITY_
ID]".+\z/$1/ms'`

実行結果は以下のとおりです。前回同様、後続ジョブ(JB_TEST2)の出力(stdout)のところに、先行ジョブ(JB_TEST)の起動コマンドの戻り値(12)が出力されていることが確認できます。

先行ジョブの実行結果

先行ジョブの実行結果

後続ジョブの実行結果

後続ジョブの実行結果

少々力技ですが、これで問題を解消することができました。

次回こそは、ジョブ自体の終了値等をコマンドで取得する方法をご紹介したいと思いますので、お楽しみに(^o^)/

Leave a Reply

You must be logged in to post a comment.