[CentOS6][SOS JobScheduler] 終了コードを判定して後処理をする


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

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


JobScheduler の内部APIを利用すると、ジョブで定義したプログラムの終了コードを判定して後処理を行うことができます。
ここでは、テスト用のシェルスクリプトの終了コードを判定して、以下の後処理をしてみます。
  • 終了コード = 0 の場合 ・・・ 正常終了する
  • 終了コード = 1 の場合 ・・・ STOPする
  • 終了コード = 5 の場合 ・・・ 30秒後にリトライ実行する
  • 上記以外 ・・・ 終了コードを 0 に設定する
今回、 ホットフォルダは、以下を使用します。
ホットフォルダ名:/home/jobs/sos-berlin.com/jobscheduler/scheduler/config/live/test/exit1
手順は、「JobSheduler FAQ」を参考にしました。

1.テスト用のシェルスクリプトの用意


今回は、外部ファイルとしてシェルスクリプトを用意します。
以下のように、 exit するだけのスクリプトです。
テスト時に exit の値を変更して、動作確認します。
ファイル名:/home/jobs/sos-berlin.com/jobscheduler/scheduler/config/live/test/exit1/test.sh
#/bin/sh
echo "** test.sh is running."
exit 0

2.ジョブの定義


JOEは使用しないで、XMLファイルを作成しました。
内容は以下のとおり。
ファイル名: sample_job.job.xml
<job stop_on_error="no">
    <script language="shell">
        <![CDATA[
./config/live/test/exit1/test.sh
        ]]>
    </script>
    <monitor name="exit_code_handler" ordering="0">
        <script language="javascript">
            <![CDATA[
function spooler_task_after(){
        spooler_job.clear_delay_after_error();
        var rc = spooler_task.exit_code;
        switch(rc) {
                case  0 :
                        spooler_log.info("Script has ended with exit code " + rc);
                        break;
                case  1 :
                        spooler_log.error("Script has ended with exit code " + rc);
                        spooler_log.info("Job will stopped");
                        spooler_job.state_text="Job will stopped";
                        spooler_job.delay_after_error(1) = "stop";
                        break;
                case  5 :
                        spooler_log.error("Script has ended with exit code " + rc);
                        spooler_log.info("Job restarts in 1 hour");
                        spooler_job.state_text="Job restarts in 1 hour";
                        spooler_job.delay_after_error(1) = "00:00:30";
                        break;
                default :
                        spooler_log.warn("Job has ended with exit code " + rc);
                        spooler_log.info("Exit code changed to 0");
                        spooler_task.exit_code = 0;
        }
}
            ]]>
        </script>
    </monitor>
    <run_time />
</job>
※ ログ用のメッセージが"Job restarts in 1 hour" となっているのは間違いです。正しくは "30 sec" です。

3.動作確認

3.1.終了コード = 0 の場合


test.sh の exit の値を 0 にして、JOCでジョブを実行します。
実行結果は、以下のとおり。後処理をして正常終了しています。
2013-03-28 15:36:46.826 [info]   SCHEDULER-918  state=starting (at=2013-03-28 15:36:46.785)
2013-03-28 15:36:46.913 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.R0pS5s"'
2013-03-28 15:36:46.961 [info]   Script has ended with exit code 0
2013-03-28 15:36:46.963 [info]   ** test.shi is running.

3.2.終了コード = 1 の場合


test.sh の exit の値を 1 にして、JOCでジョブを実行します。
実行結果は、以下のとおり。後処理をして異常終了しています。
2013-03-28 15:38:01.945 [info]   SCHEDULER-918  state=starting (at=2013-03-28 15:38:01.902)
2013-03-28 15:38:01.966 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.vzNX7Q"'
2013-03-28 15:38:01.979 [ERROR]  Script has ended with exit code 1
2013-03-28 15:38:01.979 [info]   Job will stopped
2013-03-28 15:38:01.980 [info]   ** test.sh is running.
2013-03-28 15:38:01.983 [ERROR]  SCHEDULER-280  Process terminated with exit code 1 (0x1)

3.3.終了コード = 5 の場合


test.sh の exit の値を 5 にして、JOCでジョブを実行します。
実行結果は、以下のとおり。後処理をして 30秒後のリトライを設定しています。
2013-03-28 15:38:45.344 [info]   SCHEDULER-918  state=starting (at=2013-03-28 15:38:45.296)
2013-03-28 15:38:45.365 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.xHMrFa"'
2013-03-28 15:38:45.377 [ERROR]  Script has ended with exit code 5
2013-03-28 15:38:45.377 [info]   Job restarts in 1 hour
2013-03-28 15:38:45.378 [info]   ** test.sh is running.
2013-03-28 15:38:45.382 [ERROR]  SCHEDULER-280  Process terminated with exit code 1 (0x1)
リトライ実行される前に、test.sh の exit の値を 0 にした結果が、下図です。
異常終了後、30秒待ってリトライ実行し、正常終了していることがわかります。


3.4.終了コード = 3 の場合


test.sh の exit の値を 3 にして、JOCでジョブを実行します。
実行結果は、以下のとおり。後処理でタスクの終了コードに 0 を設定して正常終了しています。
2013-03-28 15:39:51.121 [info]   SCHEDULER-918  state=starting (at=2013-03-28 15:39:51.070)
2013-03-28 15:39:51.142 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.ZRshfE"'
2013-03-28 15:39:51.154 [WARN]   Job has ended with exit code 3
2013-03-28 15:39:51.155 [info]   Exit code changed to 0
2013-03-28 15:39:51.155 [info]   ** test.sh is running.