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.