お金をかけずにサーバーの勉強をしよう

JS7インストール 2

2024年8月29日
メニューへ戻る

JS7インストール 1」では JS7 Controllerのサーバーを作りました。

絵で言うとここ。
JS7の Controllerを作った後の絵

そしてこれからこのページで作るのはこれ。
JS7の Universal Agentを作る絵

ダウンロードについては「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」につづきます。


==========
これまで環境を作りましたが、まだ実動作させた訳ではないので、果たして上手くいくかな〜?って感じです。