JobScheduler

2014/05/04更新

対応バージョン: 1.6.4119

公式サイト

システム構成

JobSchedulerにはサーバ1台によるスタンドアローン環境から大規模なクラスタ環境まで様々な構成がとれるが、ここではシンプルにスタンドアローン環境を構築する。

準備

あらかじめインストールしておくもの

MySQL (他のDBMSも利用可能。サポートするDBMSは公式サイトを参照)
JDBCドライバ(MySQLの場合はlibmysql-java)
Java実行環境

導入OS

Ubuntu 13.04

MySQL事前準備

まずMySQLの準備を行う。

最初にサーバの文字コードをUTF-8に変更する。my.cnfの[client]、[mysqld]それぞれのセクションに以下の行を追加してサーバを再起動する(すでに設定されていればこの作業は不要)。

% sudo vi /etc/mysql/my.cnf 
:
[client]
:
default-character-set=utf8
:
[mysqld]
:
character-set-server = utf8
:
% sudo service mysql restart

続いてJobScheduler専用のDBとアカウントを作成する。

ここでは以下の通りとする。

DB: scheduler
アカウント: scheduler
パスワード: scheduler_pass
% mysqladmin create scheduler

% mysql
mysql> GRANT ALL PRIVILEGES ON scheduler.* TO scheduler@localhost IDENTIFIED BY 'scheduler_pass' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

作成したアカウントでDBに接続してみる。以下のように出力されればOKである。

% mysql --user=scheduler --password=scheduler_pass scheduler

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (i686) using readline 6.2

Connection id:       65
Current database:    scheduler
Current user:        scheduler@localhost
SSL:                 Not in use
Current pager:       stdout
Using outfile:       ''
Using delimiter:     ;
Server version:      5.5.34-0ubuntu0.13.04.1-log (Ubuntu)
Protocol version:    10
Connection:          127.0.0.1 via TCP/IP
Server characterset: utf8
Db     characterset: utf8
Client characterset: utf8
Conn.  characterset: utf8
TCP port:            3306
Uptime:              19 hours 54 min 49 sec

Threads: 1  Questions: 532  Slow queries: 510  Opens: 222  Flush tables: 1  Open tables: 41  Queries per second avg: 0.007
--------------

mysql> exit
Bye

MySQLの準備ができたらJobSchedulerのインストールを行う。

配布ファイル展開

% tar xvf jobscheduler_linux-x86.1.6.4119.tar.gz
% cd jobscheduler.1.6.4119

インストール

インストーラ内部でsudoによりroot権限になるのでこの権限を持っているアカウントで作業する。

% ./setup.sh
sudo -E java -jar ./jobscheduler_linux-x64.jar
:

以降、GUI画面で設定する。CUIで設定する方法もあるが、ここでは割愛する。

インストーラの言語設定

「eng」のまま「OK」

Welcome画面

「Next」

ライセンス選択画面

希望するライセンス種別を選択して「Next」(ここではデフォルトのGPL 2.0を選択)

ライセンス許諾

「I accept...」を選択して「Next」

インストールパス

希望するパスを指定して「Next」(ここでは/usr/local/jobscheduler)

設定ファイル、及びログファイルの格納パス

希望するパスを指定して「Next」(ここでは/var/lib/jobscheduler)

インストールするコンポーネント

希望するコンポーネントを指定して「Next」(ここでは全て選択)

ジョブスケジューラのID・実行ホスト・接続ポート・HTTP[S]ポート・許可ホスト指定

以下を変更し、それ以外はデフォルトのまま「Next」

・JobScheduler ID: 任意 (ここではscheduler)

・JobScheduler Host: localhost

・Allowed Host: localhost

システム構成

希望する構成を指定して「Next」(ここではサーバ1台で全てを構成する「standalone」を選択)

メール設定

メール通知に必要なSMTPサーバ・ポート・SMTP認証用アカウント・メールアカウントを指定して「Next」(ここではlocalhostのschedulerアカウントを設定)

メール通知とイベントハンドラ設定

ジョブの結果によってエラー・警告・成功それぞれの場合でメール通知を行うか指定する。また、イベントをトリガにしたジョブを使用したい場合は「Configure JobScheduler as event handler」にチェックを入れる(この機能を後で有効にする場合、再インストールが必要になる場合があるのでひとまずチェックを入れる)。設定が終わったら「Next」

新しいバージョンのリリースチェックを行うタイミング

希望するタイミングを指定して「Next」。特にこだわりがなければデフォルトのままでよい。また自動ダウンロードをしたい場合は「with automatic download」にチェックを入れる

DBMS選択

希望するDBMSを選択して「Next」。ここではデフォルトのMySQLを選択する。尚、JobSchedulerの動作に必要なテーブルを自動生成するため、「Yes, the database tables should be created...」のチェックは入れたままにしておく

DBMS接続設定

DBMSに接続するための情報を指定する。先に作成したDBとアカウント情報を入力して「Next」。またJDBCドライバを使用するので「Yes, the MariaDB JDBC Driver should be used.」のチェックは入れたままにしておく

cron設定

scheduler_cron_adapterジョブを使用してcronジョブをJobSchedulerで実行する場合は各項目を設定するが、scheduler_cron_adapterジョブを使用しない場合はデフォルトのままで「Next」

インストール

インストールが始まる。終わったら「Next」

各種設定

画面に以下のようなログが表示され、各種設定が行われる。終わったら「Next」

+-------------------------------------------------------------------
|   Create some symlinks
+-------------------------------------------------------------------
... trying to create symlink 
/var/lib/jobscheduler/scheduler/scheduler_home -> /usr/local/jobscheduler/scheduler
... done
... trying to create symlink 
/usr/local/jobscheduler/scheduler/scheduler_data -> /var/lib/jobscheduler/scheduler
... done
... create symlinks for jetty
... trying to create symlink 
/usr/local/jobscheduler/scheduler/operations_gui/scheduler_home/doc -> /usr/local/jobscheduler/scheduler/doc
... done
... trying to create symlink 
/usr/local/jobscheduler/scheduler/operations_gui/scheduler_data/jobs -> /var/lib/jobscheduler/scheduler/jobs
... done
... trying to create symlink 
/usr/local/jobscheduler/scheduler/operations_gui/scheduler_data/config -> /var/lib/jobscheduler/scheduler/config
... done
... trying to create symlink 
/var/lib/jobscheduler/scheduler/logs -> /var/log/sos-berlin.com/jobscheduler/scheduler
... done
... trying to create symlink 
/usr/local/jobscheduler/scheduler/lib/libstdc++.so.6 -> /usr/local/jobscheduler/scheduler/lib/libstdc++.so.6.0.8
... done
... trying to create symlink 
/usr/local/jobscheduler/scheduler/lib/libgcc_s.so -> /usr/local/jobscheduler/scheduler/lib/libgcc_s.so.1
... done
... the perl version is 5.14.2
... trying to create symlink 
/usr/local/jobscheduler/scheduler/lib/libsosperlscript.so -> /usr/local/jobscheduler/scheduler/lib/libsosperlscript.5.18.2.so
... done

+-------------------------------------------------------------------
|   Configuration of ./bin/jobscheduler_environment_variables.sh
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Configuration of ./config/scheduler.xml
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Configuration of ./config/jetty.xml
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Configuration of ./config/sos.ini
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Configuration of ./config/factory.ini
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Configuration of ./config/operations_gui/custom.js
+-------------------------------------------------------------------
... done

+-------------------------------------------------------------------
|   Update jar files in ./lib
+-------------------------------------------------------------------
... trying to delete obsolete jar files
... nothing to do
... trying to install new jar files
... trying to update 3party jar files
... done

+-------------------------------------------------------------------
|   Initial database
+-------------------------------------------------------------------
... the database management system is MySQL
... create database tables which not already exist
... file successfully processed: /usr/local/jobscheduler/scheduler/db/mysql/scheduler.sql
... file successfully processed: /usr/local/jobscheduler/scheduler/db/mysql/sosftphistory.sql
... file successfully processed: /usr/local/jobscheduler/scheduler/db/mysql/sosdailyschedule.sql
... file successfully processed: /usr/local/jobscheduler/scheduler/db/mysql/scheduler_events.sql
... file successfully processed: /usr/local/jobscheduler/scheduler/db/mysql/scheduler_loganalyser.sql
... insert initial rows into database tables
... done

+-------------------------------------------------------------------
|   Change owner in /var/lib/jobscheduler/scheduler to neo
+-------------------------------------------------------------------
... the user group of "neo" is "neo".
... done

+-------------------------------------------------------------------
|   Start Job Scheduler
+-------------------------------------------------------------------
    linux-gate.so.1 =>  (0xb7719000)
    libjobscheduler-engine.so => /usr/local/jobscheduler/scheduler/lib/libjobscheduler-engine.so (0xb70b0000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb7082000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7067000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7062000)
    libstdc++.so.6 => /usr/local/jobscheduler/scheduler/lib/libstdc++.so.6 (0x069b2000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb701f000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6e6a000)
    libgcc_s.so.1 => /usr/local/jobscheduler/scheduler/lib/libgcc_s.so.1 (0x00b18000)
    /lib/ld-linux.so.2 (0xb771a000)

Starting JobScheduler...
インストール完了

以下の画面が表示されたらインストール成功。最後に「Done」

インストール物 (man,infoは除く)

/usr/local/jobscheduler/*/*
/var/lib/jobscheduler/*/*

/usr/local/jobscheduler/bin配下のファイルは以下の通り。

.version

JobSchedulerのバージョン

cronconverter.sh

crontabをJobSchedulerのジョブに変換するスクリプト(詳しくはSOSのHow to migrate cron jobs to JobScheduler jobsの項参照)

dashboard.sh

JID(JobScheduler Infomation Dashboard)起動スクリプト

jobeditor.sh

JOE(JobScheduler Object Editor)起動スクリプト

jobscheduler.sh

JobScheduler起動スクリプト

jobscheduler_client.pl

JobSchedulerにXMLコマンドを実行させるためのTCP/UDPクライアント

jobscheduler_environment_variables.sh

JobScheduler環境設定スクリプト

jobscheduler_event.sh

イベント制御スクリプト

scheduler

JobScheduler実行バイナリ

scheduler_safe.sh

JobScheduler起動監視スクリプト

setuid

ジョブ実行時の実行ユーザ変更プログラム(実際に利用する場合はJobScheduler - FAQsの中のRun Jobs as a Specific UserIDの項を参照して準備を行う)

動作確認

インストールが終わるとJobSchedulerが起動しているのでブラウザからlocalhost:4444にアクセスする。

以下のようなJOC(JobScheduler Operations Center)の画面が表示されれば正常に動作している。

他にも設定があるのでいったんサービスを終了させておく。

% sudo /usr/local/jobscheduler/scheduler/bin/jobscheduler.sh stop

各種設定

initスクリプト設置

% sudo ln -s /usr/local/jobscheduler/scheduler/bin/jobscheduler.sh /etc/init.d

% sudo update-rc.d jobscheduler.sh defaults

JOC日本語化

バージョン1.3.12.3137以降、JOCが日本語化されたのでその設定を行う。

% cd /var/lib/jobscheduler/scheduler/config/operations_gui
% sudo cp -p cp -p custom.js custom.js.org
% sudo vi custom.js

(変更前)
 24 _sos_lang            = '';

(変更後)
 24 _sos_lang            = 'ja';

サービスを起動しJOCの画面をリロードして日本語化されていることを確認する。

% sudo service jobscheduler.sh start

ジョブ実行テスト

環境が整ったのでジョブの実行テストを行う。

ここではGUIを使わず直接ジョブの定義をXMLファイルとして記述し、JICで即時実行する手順を示す。

ジョブは単純にStandaloneジョブとする。

簡単な例として現在時刻を出力するシェルスクリプトを定義する。

% cd /var/tmp
% cat <<EOD > now.job.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<job >
  <script language="shell">
    <![CDATA[
#!/bin/sh
LANG=C
echo "$SCHEDULER_JOB_NAME is running"
echo "now - `date`"
exit $?
    ]]>
  </script>
</job>
EOD

注意点として、ファイル名は「ジョブ名.job.xml」にする必要がある。この命名規則が違っているとJOEで参照しようとした際に「could not open file causeString index out of range:-1」というエラーが出て参照できない。

ジョブ定義は/var/lib/jobscheduler/scheduler/config/live配下にて管理するのでテストディレクトリを作った上でジョブ定義ファイルを配置する。

% mkdir /var/lib/jobscheduler/scheduler/config/live/test
% cd /var/lib/jobscheduler/scheduler/config/live/test
% mv /var/tmp/now.job.xml .

するとデフォルトで60秒以内にジョブ登録が行われる。JobSchedulerの再起動等は必要ない。

ジョブ定義はJOEを起動して確認できる。

% /usr/local/jobscheduler/scheduler/bin/jobeditor.sh

[File] > [Open]より先ほど作ったtestフォルダ配下のnow.job.xmlを開くとジョブ定義が取り込まれて以下のように表示される。

このジョブを即時実行してみる。

ブラウザからlocalhost:4444にアクセスしてJOCを起動し、画面左下の「test」>「now」ジョブを選択して右側の[ジョブメニュー]から[タスク即時実行]を選択する。

タスク履歴が表示され、そのタスクをクリックしてログが表示されれば成功である。

2014-05-06 00:53:59.382+0900 [info]   SCHEDULER-918  state=starting (at=2014-05-06 00:53:59.208+0900)
2014-05-06 00:53:59.382+0900 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/neo/sos.BHWY3b"'
2014-05-06 00:53:59.432+0900 [info]   now is running
2014-05-06 00:53:59.432+0900 [info]   now - Tue May  6 00:53:59 JST 2014
2014-05-06 00:53:59.432+0900 [info]   SCHEDULER-915  Process event

その他、複雑なジョブ定義やスケジューリングなどは割愛する。