OSSでジョブをビジュアルに管理したかった。
日々のジョブ管理において、業務では日立JP1/AJSやNRI千手を使っていまして、これらは素晴らしい製品なんですが、それ故に中々のお値段がいたします。
小さい会社さんだと中々導入に踏み切れないのではないかと思います。
そんな訳で無料で使える OSSのジョブスケジューラーがないかな〜と探していて、こちらを見つけました。
JS7
ドイツのSOS合同会社(Software- und Organisations-Service GmbH)が作っていまして、日本ではOSSラボ株式会社さんが正規代理店として日本語で紹介をしています。
クラスタ機能やセキュリティパッチの提供などは有償サービスとなっていますが、利用自体は無料ですので、まずは味わってみようと思います。
これから JP1/AJSや千手でのジョブ管理をしようと思うけど、どういう運用になるのかイメージが湧かないという方にも良いかも知れません。
以前から OSSのジョブスケジューラーとして「 JobScheduler」というのがありました。
JS7はこれが Ver.2にメジャーバージョンアップとともにリブランドしたものと Wikiにありました。
1.ジョブ管理ツールの構成
ジョブ管理システムの構成は3つの要素があって、こんな感じになっています。
これは JP1/AJSや千手も名こそ違えど同じ構成になっています。
JP1/AJS・千手ともに管理GUIには専用のクライアントソフトを使うのが基本になっていて基本的に JS7も同じですが Controllerがあるのが特徴です。
JS7の管理GUIは WEBベースだけですね。
まずはこれを覚えておきましょう。
2.環境
LinuxとWindowsの両方で動きますが、ここでは以下の構成でいきます。
役割 | OS | マシン名 | IPアドレス | |
---|---|---|---|---|
1 | Manager | Ubuntu Server 24.04 | js7controller | 192.168.1.104 |
2 | Agent | Ubuntu Server 24.04 | js7agent | 192.168.1.105 |
3 | DB | Ubuntu Server 24.04 | js7db | 192.168.1.107 |
4 | JOC Cockpit | Ubuntu Server 24.04 | js7cockpit | 192.168.1.108 |
5 | 管理GUI利用 | Lubuntu 24.04 | Lubuntu2404 | DHCP |
データベースは PostgreSQL 16にしてみます。
この手のソフトの真骨頂は Agentが多数あり、更に Linuxと Windowsが混在しているシステムなんですが、何台あろうが OSが違おうがこの構成の応用になります。
Ubuntu Serverのインストールについては「Ubuntu 24.04 Server インストール」に書いています。
Ubuntu Serverが 4台できていて、LinuxのクライアントPCがあるところからスタートします。
全部 Linuxでやりますが、Windowsでも基本的に同じことです。
2024年8月27日での JS7の最新バージョンは 2.7.1です。
JS7は Javaでできていますので、上記のうち 1・2・4の OSにはみな OpenJDK 21をインストールしてあります。
OpenJDKのインストールについては「Java SE Development Kit (JDK) 21 インストール」に書いています。
3.ダウンロード
ダウンロードはこちらから。
JobScheduler Downloads
JS7での名称はこのようになっています。
役割 | 名称 |
---|---|
Manager | JS7 JobScheduler Controller |
Agent | JS7 JobScheduler Universal Agent |
管理GUI利用 | JS7 JobScheduler JOC Cockpit |
それぞれダウンロードします。
JOC Cockpitがこちら。
Controllerがこちら。
Universal Agentがこちら。
結果以下を入手しました。
[js7_agent_unix.2.7.1.tar.gz]ファイル
[js7_controller_unix.2.7.1.tar.gz]ファイル
[js7_joc_linux.2.7.1.tar.gz]ファイル
4.コントローラーの環境構築
[js7controller]サーバーでの作業になります。
絵で言うとここ。
一応以下のリンクがインストール用のドキュメントなんですが、余り多くを書いていないのと、後述する systemdでの自動起動については言及してなかったので、ここでは勝手な手順でやっています。
JS7 - Controller - Headless Installation on Linux and Windows
必須ではないですが、専用に [js7]ユーザー・[js7]グループを作ってそれに JS7を実行させることにしました。
ユーザー・グループを作成します。
ssubro@js7controller:~$ sudo adduser js7
info: ユーザ `js7' を追加しています...
info: Selecting UID/GID from range 1000 to 59999 ...
info: 新しいグループ `js7' (1001) を追加しています...
info: Adding new user `js7' (1001) with group `js7 (1001)' ...
info: ホームディレクトリ `/home/js7' を作成しています...
info: `/etc/skel' からファイルをコピーしています...
新しいパスワード: 新規パスワードを入れる
新しいパスワードを再入力してください: パスワードをもう一回
passwd: パスワードは正しく更新されました
js7 のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []:[Enter]キー
部屋番号 []:[Enter]キー
職場電話番号 []:[Enter]キー
自宅電話番号 []:[Enter]キー
その他 []:[Enter]キー
以上で正しいですか? [Y/n] Y
info: Adding new user `js7' to supplemental / extra groups `users' ...
info: ユーザ `js7' をグループ `users' に追加しています...
ユーザー・グループができましたので、[js7]ユーザーでログインし直しました。
[js7]ユーザーのホームディレクトリはこんな感じです。
ダウンロードした Controllerのファイルを置いておきました。
js7@js7controller:~$ ls -la
合計 93084
drwxr-x--- 3 js7 js7 4096 8月 20 06:40 .
drwxr-xr-x 4 root root 4096 8月 20 06:33 ..
-rw------- 1 js7 js7 5 8月 20 06:40 .bash_history
-rw-r--r-- 1 js7 js7 220 8月 20 06:33 .bash_logout
-rw-r--r-- 1 js7 js7 3771 8月 20 06:33 .bashrc
drwx------ 2 js7 js7 4096 8月 20 06:39 .cache
-rw-r--r-- 1 js7 js7 807 8月 20 06:33 .profile
-rw-rw-r-- 1 js7 js7 95289300 8月 20 06:40 js7_controller_unix.2.7.1.tar.gz
Controllerのファイルは [tar.gz]形式の圧縮ファイルですので、解凍しながら展開します。
js7@js7controller:~$ tar -xzvf js7_controller_unix.2.7.1.tar.gz
〜〜〜 省略 〜〜〜
解凍・展開ができまして [controller]ディレクトリができました。
js7@js7controller:~$ ls -ld controller
drwxrwx--- 5 js7 js7 4096 7月 9 04:32 controller
[controller/bin]ディレクトリにあるファイルが以下のようになっていました。
js7@js7controller:~$ ls -l controller/bin
合計 48
-rwxrwx--- 1 js7 js7 643 7月 9 04:32 anonymize-logs.sh
-rw-rw---- 1 js7 js7 2276 7月 9 04:32 controller.service-example
-rwxrwx--- 1 js7 js7 27302 7月 9 04:32 controller.sh
-rwxrwx--- 1 js7 js7 5155 7月 9 04:32 controller_instance.sh-example
-rwxrwx--- 1 js7 js7 2911 7月 9 04:32 controller_watchdog.sh
インストールドキュメントでは [controller_instance.sh-example]ファイルをコピーして [controller_instance.sh]ファイルを作成し、これを実行するように書いてあります。
js7@js7controller:~$ cd controller/bin
js7@js7controller:~/controller/bin$ cp controller_instance.sh-example controller_instance.sh
js7@js7controller:~/controller/bin$ ls -l controller_instance.sh
-rwxrwx--- 1 js7 js7 5155 8月 21 06:20 controller_instance.sh
[controller_instance.sh]ファイルができましたので、当環境に合わせて修正しようと思いましたが、一通りデフォルト設定で良さげなのでそのままにしました。
(待受ポート番号とかPIDファイル名とか色々変えられます)
ファイルの実行権限もついているので、このままで良いでしょう。
[controller.service-example]ファイルの中身を見てみますと、これは OS起動時に自動起動させるための systemd用の サービスユニットファイルでありました。
この手のソフトの運用では常に起動しておくものと考えますので、こちらの方式で起動しようと思います。
[controller.service-example]ファイルをコピーして [controller.service]ファイルを作ります。
js7@js7controller:~/controller/bin$ cp controller.service-example controller.service
js7@js7controller:~/controller/bin$ ls -l controller.service
-rw-rw---- 1 js7 js7 2276 8月 21 06:38 controller.service
[controller.service]ファイルができましたので、当環境に合わせて若干修正します。
ピンク色が修正した箇所です。
(分かりやすくするため #で始まるコメント行は削除しています)
[Unit]
Description=SOS JS7 Controller -id=JS7_TEST
After=syslog.target
After=network.target
[Service]
Type=forking
KillMode=process
PIDFile=/home/js7/controller/controller.pid
ExecStartPost=/bin/sleep 1
ExecStart=/home/js7/controller/bin/controller_instance.sh start
ExecStop=/home/js7/controller/bin/controller_instance.sh stop
ExecReload=/home/js7/controller/bin/controller_instance.sh restart
User=js7
StandardOutput=journal+console
StandardError=journal+console
TimeoutStopSec=60
TasksMax=infinity
[Install]
WantedBy=multi-user.target
できあがった [controller.service]ファイルを systemd用の [/usr/lib/systemd/system]ディレクトリにコピーしたいんですが、このディレクトリは [root]権限がないと書き込めませんので、sudoコマンドを使うため、もう一つターミナルを開いて管理者ユーザーの [subro] でやります。
subro@js7controller:~$ sudo cp /home/js7/controller/bin/controller.service /usr/lib/systemd/system
subro@js7controller:~$ ls -l /usr/lib/systemd/system/controller.service
-rw-r----- 1 root root 541 8月 21 06:54 /usr/lib/systemd/system/controller.service
ファイルのオーナー・グループ・パーミッションともこのままで良さそうです。
[controller.service]ファイルが OS起動時の自動起動に含まれるように有効化します。
subro@js7controller:~$ sudo systemctl enable controller.service
Created symlink /etc/systemd/system/multi-user.target.wants/controller.service → /usr/lib/systemd/system/controller.service.
良さげですので、試しに OSを再起動してみます。
subro@js7controller:~$ sudo reboot
Broadcast message from root@js7controller on pts/2 (Wed 2024-08-21 07:01:39 JST):
The system will reboot now!
再起動完了後に改めて [js7]ユーザーでログインして、さっき作った [controller.service]ファイルで上手く起動しているか確認します。
js7@js7controller:~$ ystemctl status controller
● controller.service - SOS JS7 Controller -id=JS7_TEST
Loaded: loaded (/usr/lib/systemd/system/controller.service; enabled; preset: enabled)
Active: activating (start-post) since Wed 2024-08-21 07:21:48 JST; 21s ago
Process: 850 ExecStart=/home/js7/controller/bin/controller_instance.sh start (code=exited, status=0/SUCCESS)
Process: 1129 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)
Tasks: 34
Memory: 331.8M (peak: 332.2M)
CPU: 12.763s
CGroup: /system.slice/controller.service
├─1127 /bin/sh /home/js7/controller/bin/controller_watchdog.sh -controller
└─1130 /usr/bin/java -DJS7.Controller=controller -Xmx500m -Dfile.encoding=UTF-8 -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j2.async>
8月 21 07:21:50 js7controller controller_instance.sh[1127]: ...JS7 Controller(controller) is started with pid=1130!
8月 21 07:21:50 js7controller controller_instance.sh[1127]: ...see log file /home/js7/controller/var/logs/controller.log
8月 21 07:21:50 js7controller controller_instance.sh[1127]: ...watchdog for pid 1130 is started
8月 21 07:21:50 js7controller controller_instance.sh[1127]: Hit ENTER to return to command prompt.
Warning: journal has been rotated since unit was started and some journal files were not opened due to insufficient permissions, output may be incomplete.
起動していました。\(^o^)/
5.JS7 Universal Agentとの通信準備
これは必須ではないのですが、私の環境では他サーバーとの連携においてなるべくマシン名を使っていきたいので、[js7controller]サーバーの [/etc/hosts]ファイルに以下の行を追加しました。
192.168.1.105 js7agent js7agent.subrohouse.internal
「JS7インストール 2」につづきます。
==========
思いの他長くなってしまったので、別ページで続きをすることにします。
当初はデータベースを JOC Controllerのマシンに同居させるつもりでしたが、本気の環境では JOC Controllerも冗長化するようですので(無償版ではできない)、データベースは独立させることにしました。