[CentOS6][SOS JobScheduler] いろいろなジョブの実装例(XML)とステータスの意味


Create: 2013/03/11
LastUpdate: 2013/03/27
[ メニューに戻る ]

JOBの定義ファイルの格納先


JOEを使用するとGUIでJOBを定義できますが、定義内容はXMLファイルで保存されます。
保存先は、liveフォルダ直下のホットフォルダです。
liveフォルダ: /home/jobs/sos-berlin.com/jobscheduler/scheduler/config/live

JOEを使用せずに、viなどのエディタで、XMLファイルを作成してもジョブを定義できます。
ホットフォルダは、階層を掘りさげて作成してもOKです。
例えば、test という名称のホットフォルダが以下のような階層の場合、
$ tree -F /home/jobs/sos-berlin.com/jobscheduler/scheduler/config/live/test
/home/jobs/sos-berlin.com/jobscheduler/scheduler/config/live/test
├── Host-A.process_class.xml
├── Host-B.process_class.xml
├── error_job.job.xml
├── event_job.job.xml
├── event_monitor_job.job.xml
├── job1.job.xml
├── job3.job.xml
├── job_chain01.config.xml
├── job_chain01.job_chain.xml
├── sample1/
│   └── shell_job.job.xml
├── sample2/
├── sample3/
└── test_lock.lock.xml
JOC では、下図のように見ることができます。
JobChainなどの定義で、別フォルダのジョブを指定する場合は、liveフォルダをルートとしたフルパスで指定します。(赤枠を参照)



JOBの定義例


Unixにインストールした JobScheduler では、Unixで実行可能なプログラムであればジョブから実行できるようです。
Javascript については、JobSchedulerが実行環境(spidermonkey)を実装しているようです。
詳しくは、「Reference Documentation」または、「Example Job Scheduling Solutions」を参照してください。
以下にいくつか、ジョブの定義例をXMLで紹介します。
<script>の要素としてコマンドを組み込む例
<job name="simple_shell">
  <script language="shell"><![CDATA[
    echo hello world
    call my_script.sh
    my_prog.sh
  ]]></script>
</job>  
シェルスクリプトのファイルを <include> で指定する例
<job name="simple_command">
  <script language="shell">
    <include file="my_script.sh"/>
  </script>
</job>
<process>で Perlプログラムのファイルを指定する例
<job name="simple_job">
  <process file="my_prog.pl"/>
</job>
<process>で php コマンドを指定し、そのパラメータで php のスクリプトファイルを指定する例
<job name="interpreter_job">
  <process file="/usr/bin/php"
           param="-f '/home/jobs/phpinfo.php'"/>
</job>

JOBにJobSchedulerの内部APIを実装


Javascript、Java、Perl 、VBScript(Windowsのみ)などを使用する場合は、プログラムに JobScheduler の内部APIを実装することができます。
内部APIを実装すると、以下のオブジェクト変数が使用できるようになります。
詳しくは、「Reference Documentation」または、「Internal API-Jobs(PDF)」を参照してください。
  • spooler: 基本情報
  • spooler_log: ログ情報
  • spooler_job: ジョブ情報
  • spooler_task:  タスク情報
また、JobScheduler から実行される以下のメソッドを実装できます。詳細はドキュメントを参照してください。
  • spooler_init: コンストラクタ。spooler_open()より前に一回だけ呼び出されます。
  • spooler_open: タスク開始時に呼び出されます。
  • spooler_process: ジョブステップまたはOrder処理時に呼び出される。StandaloneJobとOrderJobでは少し違いあり。
  • spooler_close: タスク終了時に呼び出されます。
  • spooler_on_success: 正常終了時に呼び出されます。
  • spooler_on_error: 異常終了時に呼び出されます。
  • spooler_exit: デストラクタ。スクリプトがアンロードされる前に最後のメソッドとして呼び出されます。
spooler_proccess は、ステップ・バイ・ステップの処理に適しています。spooler_process の実装では、プロセスの進行状況をジョブスケジューラインターフェイスで追跡することができることと、各タスクは、ステップ・バイ・ステップで監視することができるという利点を提供しています。spooler_process の各呼び出しは、ジョブスケジューラのジョブステップとしてカウントされます。


StandaloneJob で Javascript を使用した場合の内部APIの実装例は以下のとおりです。
<?xml version="1.0" encoding="ISO-8859-1"?>
<job >
    <params>
      <param name="param1" value="value of param1" />
    </params>
    <script  language="javascript">
        <![CDATA[
spooler_log.info("** " + spooler_job.name + " is RUNNING.");
var cnt;
function spooler_init() {
  cnt = 0;
  spooler_log.info( "*** spooler_init called" );
  return true;
}
function spooler_open() {
  spooler_log.info( "*** spooler_open called" );
  return true;
}
function spooler_close() {
  spooler_log.info( "*** spooler_close called" );
  return true;
}
function spooler_process() {
  if (cnt < 5) {
    spooler_log.info( "*** spooler_process called (" + ++cnt + ") times." );
    var params = getParameter();
    if (params != null) {
      var names = params.names().split(";");
      for (var i in names) {
        spooler_log.info ("**** Parameter: " + names[i] + " = " + params.value(names[i]));
      }
      // create an additional parameter
      spooler_task.params.set_var ("p" + cnt.toString(), "Value of parameter " + cnt.toString());
    }
    spooler_log.info("-----------------------------------------------");
    return true; // continue run, continue with next call to process
  }
  return false; // end run, continue process with exit and close
}
function spooler_on_success() {
  spooler_log.info("*** spooler_on_success called");
  return true;
}
function spooler_exit() {
  spooler_log.info("*** spooler_exit called");
  return false;
}
function spooler_on_error() {
  spooler_log.error("*** error during job-run: " + spooler_task.error);
  return true;
}
function getParameter () {
  var params = spooler.create_variable_set();
  var taskParams = spooler_task.params;
  if (taskParams != null) {
    params.merge(taskParams);
  }
  var order = spooler_task.order;
  if (order != null) { // to avoid TypeError: "order has no properties in line 31, column 1,"
    params.merge(order.params);
  }
  return params;
}
        ]]>
    </script>
    <run_time />
</job>
このジョブを実行すると以下のようになります。
2013-03-26 09:05:16.169 [info]   SCHEDULER-918  state=starting (at=2013-03-26 09:05:16.099)
2013-03-26 09:05:16.190 [info]   ** test/js_job is RUNNING.
2013-03-26 09:05:16.191 [info]   *** spooler_init called
2013-03-26 09:05:16.197 [info]   *** spooler_open called
2013-03-26 09:05:16.198 [info]   *** spooler_process called (1) times.
2013-03-26 09:05:16.199 [info]   **** Parameter: param1 = value of param1
2013-03-26 09:05:16.199 [info]   -----------------------------------------------
2013-03-26 09:05:16.200 [info]   *** spooler_process called (2) times.
2013-03-26 09:05:16.202 [info]   **** Parameter: p1 = Value of parameter 1
2013-03-26 09:05:16.202 [info]   **** Parameter: param1 = value of param1
2013-03-26 09:05:16.202 [info]   -----------------------------------------------
2013-03-26 09:05:16.203 [info]   *** spooler_process called (3) times.
2013-03-26 09:05:16.204 [info]   **** Parameter: p1 = Value of parameter 1
2013-03-26 09:05:16.205 [info]   **** Parameter: p2 = Value of parameter 2
2013-03-26 09:05:16.205 [info]   **** Parameter: param1 = value of param1
2013-03-26 09:05:16.205 [info]   -----------------------------------------------
2013-03-26 09:05:16.206 [info]   *** spooler_process called (4) times.
2013-03-26 09:05:16.207 [info]   **** Parameter: p1 = Value of parameter 1
2013-03-26 09:05:16.208 [info]   **** Parameter: p2 = Value of parameter 2
2013-03-26 09:05:16.208 [info]   **** Parameter: p3 = Value of parameter 3
2013-03-26 09:05:16.208 [info]   **** Parameter: param1 = value of param1
2013-03-26 09:05:16.209 [info]   -----------------------------------------------
2013-03-26 09:05:16.210 [info]   *** spooler_process called (5) times.
2013-03-26 09:05:16.211 [info]   **** Parameter: p1 = Value of parameter 1
2013-03-26 09:05:16.211 [info]   **** Parameter: p2 = Value of parameter 2
2013-03-26 09:05:16.211 [info]   **** Parameter: p3 = Value of parameter 3
2013-03-26 09:05:16.212 [info]   **** Parameter: p4 = Value of parameter 4
2013-03-26 09:05:16.212 [info]   **** Parameter: param1 = value of param1
2013-03-26 09:05:16.213 [info]   -----------------------------------------------
2013-03-26 09:05:16.214 [info]   *** spooler_close called
2013-03-26 09:05:16.214 [info]   *** spooler_on_success called
2013-03-26 09:05:16.215 [info]   *** spooler_exit called

JOBの実行ステータス 


ジョブは、以下の実行ステータスを持ちます。ジョブのステータスはJOCなどで見ることができます。

pending 全くタスクが実行されていません。開始状態
running 少なくとも1つのタスクが実行されています。
stopping ジョブが停止しています。Job Schedulerは、別のタスクを起動せず、現在のすべてのタスクが停止されています。すぐに、すべてのタスクをstoppedするには、ジョブのステータスを stopped に変更します。 
stopped 全くタスクが実行されていない。また、Job Schedulerによって開始される作業もない。 
read_error 再読込みコマンドは、エラーの原因となっており、プログラム·コードをファイルから読み取ることができない。ジョブを使用できません。
error エラーが発生した。JobSchedulerは、新しいタスクを開始しません。