「JS7インストール 1」では JS7 Controllerのサーバーを作りました。
絵で言うとここ。
そしてこれからこのページで作るのはこれ。
ダウンロードについては「JS7インストール 1」で既に書いていますので、そちらを見て下さい。
既にダウンロードしたファイルを [js7agent]サーバーに持っているところからスタートします。
1.インストール前準備
[js7agent]サーバーでも、[js7controller]サーバーと同様に、JS7を実行するために専用の [js7]ユーザー]を作成します。
ここで設計上の注意が 1つあります。
JS7が [js7] という一般ユーザーで実行されるということは、プログラムの実行権限やファイルの参照権限など、[js7]ユーザーが持っている権限内の作業しかできません。
具体的には [root]ユーザーや sudoコマンドの利用を許可されたユーザーしかできない作業をするジョブの実行ができません。
[root]ユーザーで実行してしまえば楽ではあるんですが、この手のソフトのように他のノードから操作されるソフトの場合は、可能な限り権限を限定するのが安全ですので、ここではこうしました。
必要なら [/etc/sudoers]ファイルを利用して [js7]ユーザーに適切な権限を与えるべきかと思います。
[js7]ユーザー・グループを作成します。
subro@js7agent:~$ 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]ユーザー・グループができました。
ここで使っているターミナルは後で使いますので、そのままにしておくのが良いでしょう。
2.インストール
一応以下のリンクがインストール用のドキュメントなんですが、やっぱり余り多くを書いていないので、ここでも勝手な手順でやっています。
JS7 - Agent - Headless Installation on Unix and Windows
ターミナルをもう一つ開いて [js7agent]サーバーに [js7]ユーザーでログインします。
私はダウンロードしておいた Universal Agentのファイルを scpコマンドで [js7]ユーザーのホームディレクトリ [/home/js7]に持ってきました。
js7@js7agent:~$ ls -l js7_agent_unix.2.7.1.tar.gz
-rw-rw-r-- 1 js7 js7 172010770 8月 22 07:19 js7_agent_unix.2.7.1.tar.gz
このファイルは [tar.gz]形式の圧縮ファイルですので、解凍しながら展開します。
js7@js7agent:~$ tar -xzvf js7_agent_unix.2.7.1.tar.gz
〜〜〜 省略 〜〜〜
解凍・展開ができまして [agent]ディレクトリができました。
js7@js7agent:~$ ls -ld agent
drwxrwx--- 6 js7 js7 4096 7月 9 04:35 agent
[agent/bin]ディレクトリにあるファイルが以下のようになっていました。
js7@js7agent:~$ ls -l agent/bin
合計 68
-rw-rw---- 1 js7 js7 2217 7月 9 04:35 agent.service-example
-rwxrwx--- 1 js7 js7 26708 7月 9 04:35 agent.sh
-rwxrwx--- 1 js7 js7 734 7月 9 04:35 agent_base64_value.sh
-rwxrwx--- 1 js7 js7 754 7月 9 04:35 agent_credential_value.sh
-rwxrwx--- 1 js7 js7 5538 7月 9 04:35 agent_instance.sh-example
-rwxrwx--- 1 js7 js7 3018 7月 9 04:35 agent_watchdog.sh
-rwxrwx--- 1 js7 js7 597 7月 9 04:35 anonymize-logs.sh
-rwxrwx--- 1 js7 js7 563 7月 9 04:35 file_transfer_history.sh
-rwxrwx--- 1 js7 js7 789 7月 9 04:35 js7_decrypt.sh
-rwxrwx--- 1 js7 js7 740 7月 9 04:35 js7_encrypt.sh
Controllerと同じ設計になっているようで、ファイル名が「example」で終わっているファイルをコピーして、systemd用のサービスユニットファイルと、実行するスクリプトファイルを作ります。
が、
Universal Agentは待ち受けるポートをユーザーが明示的に指定する設計のようです。
これは 1つのサーバーで複数の Universal Agentを実行する際には、ポート番号をずらしていく必要があるからです。
そしてこのポート番号は Universal Agentのランタイムデータを扱うディレクトリ名に使われていて、個々のUniversal Agentのデータを分離しておく設計になってますね。
何で 1つのサーバーで複数の Universal Agentを立ち上げる必要があるのか?
マニュアルを読むと、セキュリティを確保するためジョブの実行ユーザーを分けるためのようです。
私はこのページの上の方で「sudoresを使って〜」って書いてしまっていますが、そうではなく実行ユーザー毎に Universal Agentを立ち上げるのが JS7側が考えている運用設計なのかも知れません。
ここでの実験では複数の Universal Agentを立ち上げませんが、一応この設計思想に従い [60000/tcp] を使うことにしました。
(デフォルトは 4445番です。60000番に特に意味はなく、私の趣味です。)
[agent_service-example]をコピーしてsystemd用のサービスユニットファイルを作りますが、この際に上に書いた待受ポート番号がファイル名に必要になります。
js7@js7agent:~$ cd agent/bin
js7@js7agent:~/agent/bin$ cp -p agent.service-example agent_60000.service
js7@js7agent:~/agent/bin$ ls -l agent_60000.service
-rw-rw---- 1 js7 js7 2217 7月 9 04:35 agent_60000.service
[agent_60000.service]ファイルができました。
[agent_60000.service]ファイルを編集します。
ピンク色が変更した箇所です。
[Unit]
Description=SOS JS7 Agent -port=60000
After=syslog.target
After=network.target
[Service]
Type=forking
KillMode=process
PIDFile=/home/js7/agent/agent.pid
ExecStartPost=/bin/sleep 1
ExecStart=/home/js7/agent/bin/agent_60000.sh start
ExecStop=/home/js7/agent/bin/agent_60000.sh stop
ExecReload=/home/js7/agent/bin/agent_60000.sh restart
User=js7
StandardOutput=journal+console
StandardError=journal+console
TimeoutStopSec=60
TasksMax=infinity
[Install]
WantedBy=multi-user.target
実行スクリプトの方を作ります。
js7@js7agent:~/agent/bin$ cp -p agent_instance.sh-example agent_60000.sh
js7@js7agent:~/agent/bin$ ls -l agent_60000.sh
-rwxrwx--- 1 js7 js7 5538 7月 9 04:35 agent_60000.sh
[agent_60000.sh]ファイルができました。
agent_60000.sh]ファイルを 2行編集します。
ピンク色が変更した箇所です。
#JS7_AGENT_HTTP_PORT=
↓
JS7_AGENT_HTTP_PORT=60000 ← コメントアウト(#)を削っています
#JS7_AGENT_PID_FILE_DIR=
↓
JS7_AGENT_PID_FILE_DIR=/home/js7/agent ← コメントアウト(#)を削っています
[bin]ディレクトリの隣にある [var]ディレクトリをポート番号 60000番で動く Agent専用にコピーして作ります。
js7@js7agent:~/agent/bin$ cp -p -R ../var ../var_60000
js7@js7agent:~/agent/bin$ ls -ld ../var_60000
drwxrwx--- 5 js7 js7 4096 7月 9 04:35 ../var_60000
[var/var_60000]ディレクトリができました。
[agent.service]ファイルを systemd用の [/usr/lib/systemd/system]ディレクトリにコピーしたいんですが、このディレクトリは [root]権限がないと書き込めませんので、sudoコマンドを使うため、もう一つターミナルを開いて管理者ユーザーの [subro]
でやります。
subro7@js7agent:~$ sudo cp /home/js7/agent/bin/agent.service /usr/lib/systemd/system
subro7@js7agent:~$ ls -l /usr/lib/systemd/system/agent_60000.service
-rw-r----- 1 root root 2134 8月 24 09:10 /usr/lib/systemd/system/agent_60000.service
コピーできました。
[agent_60000]サービスが自動起動するようにします。
subro7@js7agent:~$ sudo systemctl enable agent_60000
Created symlink /etc/systemd/system/multi-user.target.wants/agent_60000.service → /usr/lib/systemd/system/agent_60000.service.
できました。
自動起動するか確認するため、[js7agent]サーバーを再起動しました。
subro7@js7agent:~$ sudo reboot
Connection to js7agent closed by remote host.
Connection to js7agent closed.
再起動か完了してから、[js7]ユーザーで再ログインして、[agent_60000]サービスの状態を確認します。
subro7@js7agent:~$ systemctl status agent_60000
● agent_60000.service - SOS JS7 Agent -port=60000
Loaded: loaded (/usr/lib/systemd/system/agent_60000.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-08-24 10:02:27 JST; 14min ago
Process: 851 ExecStart=/home/js7/agent/bin/agent_60000.sh start (code=exited, status=0/SUCCESS)
Process: 1032 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)
Main PID: 1033 (java)
Tasks: 32
Memory: 384.5M (peak: 399.0M)
CPU: 17.440s
CGroup: /system.slice/agent_60000.service
├─1029 /bin/sh /home/js7/agent/bin/agent_watchdog.sh -60000
└─1033 /usr/bin/java -DJS7.Agent=60000 -Xms100m -Dfile.encoding=UTF-8 -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.Async>
8月 24 10:02:26 js7agent agent_60000.sh[1029]: ...JS7 Agent(60000) is started with pid=1033!
8月 24 10:02:26 js7agent agent_60000.sh[1029]: ...see log file /home/js7/agent/var_60000/logs/agent.log
8月 24 10:02:26 js7agent agent_60000.sh[1029]: ...watchdog for pid 1033 is started
8月 24 10:02:26 js7agent agent_60000.sh[1029]: 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.
良さげな気がします。
[60000/tcp]を使ってるでしょうか。
subro7@js7agent:~$ ss -atp | grep 60000
LISTEN 0 100 *:60000 *:* users:(("java",pid=1033,fd=154))
良さげですね。\(^o^)/
どうやらこれでジョブ実行をするサーバーに Universal Agent環境を作れたようです。
「JS7インストール 3」につづきます。
==========
これまで環境を作りましたが、まだ実動作させた訳ではないので、果たして上手くいくかな〜?って感じです。