[CentOS6][SOS JobScheduler] 終了コードを判定してジョブを実行する


Create: 2013/03/25
LastUpdate: 2013/05/24
[ メニューに戻る ]

下図の環境を使用します。
環境の詳細を知りたい場合は、メニューに戻って構築手順を参照してください。


JobScheduler には、ジョブに定義したプログラムの終了コードを判定してジョブやJobChainを実行する機能があります。
ここでは、この機能を利用して、ジョブが異常終了したときに、エラー処理用のジョブを実行するようにしてみます。
JOB1 をわざと異常終了させて、異常終了時は、JOB2 を実行するように定義します。
もちろん、JOB1 が正常終了すれば JOB2 は実行されません。

1.JOB1の定義


JOEで下図のようにジョブを定義します。
このジョブは、テスト用にわざと異常終了させるので Exitcode を "1" にします。


Exitcode がエラーの場合に実行するジョブを設定します。
左側メニューで[Commands] をクリックすると下図の画面が表示されます。
[New Command]ボタンをクリックすると、"error" が作成されます。


左側メニューで[error] をクリックすると下図の画面が表示されます。
[Add Job]ボタンをクリックすると、"start_job" が作成されます。
この "start_job" にエラー処理用のジョブを設定します。


左側メニューで [start_job] をクリックすると、下図の画面が表示されます。
[Job / Order] に実行するジョブ名の"/test/error_job" を入力します。
"/test" は "error_job" が格納されているホットフォルダの名称です。


2.JOB2の定義


JOEで下図のようにエラー処理用のジョブを定義します。


3.JOB2の定義


JOCで JOB1(shell_job) を 実行すると、下図のようにエラーになります。


JOB1(shell_job) の実行結果は以下のとおり。
最終行を見ると、JOB2(error_job) を実行しているのがわかります。
2013-03-25 14:51:25.142 [info]   SCHEDULER-918  state=starting (at=2013-03-25 14:51:25.106)
2013-03-25 14:51:25.176 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.cIfR2c"'
2013-03-25 14:51:25.222 [info]   shell_job processed 
2013-03-25 14:51:25.222 [info]   Current Timestamp: 2013-03-25 14:51:08
2013-03-25 14:51:25.222 [info]   Current Hostname: centos6y
2013-03-25 14:51:25.222 [info]   Current Username: jobs
2013-03-25 14:51:26.330 [ERROR]  SCHEDULER-280  Process terminated with exit code 1 (0x1)
2013-03-25 14:51:26.330 [info]   SCHEDULER-965  Executing command <?xml version="1.0" encoding="ISO-8859-1"?><start_job job="/test/error_job"/>
JOB2(error_job) の実行結果は以下のとおり。
2013-03-25 14:51:26.406 [info]   SCHEDULER-918  state=starting (at=2013-03-25 14:51:26.331)
2013-03-25 14:51:26.415 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.LSOBug"'
2013-03-25 14:51:26.455 [info]   error_job processed 
2013-03-25 14:51:26.455 [info]   Current Timestamp: 2013-03-25 14:51:09
2013-03-25 14:51:26.455 [info]   Current Hostname: centos6y
2013-03-25 14:51:26.455 [info]   Current Username: jobs



■ 補足

上記の終了コードが 0 以外の場合にジョブを実行する shell_job の XML定義は、以下のようになります。
<job  process_class="Host-A">
    <params />
    <script  language="shell">
        <![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
exit 1
        ]]>
    </script>
    <run_time />
    <commands  on_exit_code="error">
        <start_job  job="/test/error_job"/>
    </commands>
</job>

終了コードが 0 の場合に、ジョブを実行するようにしたい場合は、以下のようになります。
なお、複数のジョブを実行することも可能です。以下の例では、job1 と job2 はパラレルで実行されます。
<job  process_class="Host-A">
    <params />
    <script  language="shell">
        <![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
exit 0
        ]]>
    </script>
    <run_time />
    <commands  on_exit_code="success">
        <start_job  job="/test/job1"/>
        <start_job  job="/test/job2"/>
    </commands>
</job>
さらに、JobChain を実行したい場合は、以下のようになります。
<job  process_class="Host-A">
    <params />
    <script  language="shell">
        <![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
exit 0
        ]]>
    </script>
    <run_time />
    <commands  on_exit_code="success">
        <start_job  job="/test/job1"/>
        <start_job  job="/test/job2"/>
        <order  job_chain="/test/job_chain1" replace="yes"/>
        <order  job_chain="/test/job_chain2" replace="yes"/>
    </commands>
</job>
この例だと、shell_job が正常終了すると、job1、job2、job_chain1、job_chain2 がパラレルで実行されます。
ただし、同じジョブをパラレルで実行したい場合は、 多重度(tasks)を変える必要があります。
このパラレルで実行する機能と、 同期する機能を組み合わせると、ある程度の複雑なジョブフローも実現できます。詳細は、SOS GmbH の HowTO を参照してください。