(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Keycloak/RHBK】WindowsServerでkc.batをサービス化する流れ

スポンサーリンク

はじめに

Keycloak(RedHat Build of Keycloak)はLinuxではkc.sh、Windowsではkc.batを利用して起動します。
これらを自動起動させたい場合、Linuxにてsystemdでサービス化するのと同じようにWindowsでもサービスに登録する必要があります。

一方で公式ドキュメントには同手順が公開されていないため、RedHat Single Sign Onと同じ方式でKeycloakのサービス化を行いました。その際の手順をログと共に記載しています。

環境情報
  • Windows Server 2019
  • RedHat Build of Keycloak
  • procrun 1.3.3.0

Procrunを利用する

Windows環境でJava アプリケーションをWindowsサービスとしてラップできるようにするアプリケーションにPrunsrv(Procrun Service)があります。こちらはOSSでも提供がありますが、今回はRed Hatが"JBoss Core Services Collection"にてJsvcとして提供しているので、同ソフトウェアを落とした上で利用しました。

tree .\jbcs-jsvc-1.3.3-SP2-win6-x86_64\jbcs-jsvc-1.3\
C:\USERS\xx\JBCS-JSVC-1.3.3-SP2-WIN6-X86_64\JBCS-JSVC-1.3
├─bin
├─doc
└─sbin

これをKeycloakのインストール先ディレクトリに展開をし、bin配下にあるprunmgr.exe関してはkc.batと同じ階層に配置します。

サービス作成を行う

実行コマンドは変数として記載する前提で以下となります。中を見れば分かりますが、コマンドとしてはcmd.exeからkc.bat startを叩いていて、停止時はPid番号を指定してkillするようにしています。

c:\xx\sbin\prunsrv.exe install keycloak --ServiceUser=LocalSystem  --LogLevel=INFO --LogPath=c:\xx\log --LogPrefix=service --StdOutput=auto --StdError=auto --StartMode=exe --Startup=manual --StartImage=cmd.exe --StartPath=c:\xx\bin\ ++StartParams="/c#kc.bat#start" --PidFile=test.pid --StopMode=exe --StopImage=cmd.exe --StopPath=c:\bin\  ++StopParams="/V:ON#/c#set#/p#PID=<c:\xx\log\test.pid&&taskkill#/t#/pid#!PID!#/F"

このワンライナーを実行するとサービスが作成されます。

PS C:\xx\bin> .\make-service.bat
.. [info]  [ 7500] Apache Commons Daemon procrun (1.3.3.0 64-bit) started.
.. [info]  [ 7500] Installing service 'keycloak' name '(null)'.
.. [info]  [ 7500] Service 'keycloak' installed.
.. [info]  [ 7500] Apache Commons Daemon procrun finished.
PS > Get-Service -name keycloak

Status   Name               DisplayName
------   ----               -----------
Stopped  keycloak       keycloak

サービスを起動する

以下で起動が行えます。

PS > Start-Service -name keycloak

StatusはRunningになれば成功。

PS > Get-Service -name keycloak

Status   Name               DisplayName
------   ----               -----------
Running  keycloak       keycloak

ログには以下のようにプロセスID含めて残っていて

[..] [info]  [ 2764] Apache Commons Daemon procrun (1.3.3.0 64-bit) started.
[..] [info]  [ 2764] Running Service 'keycloak'...
[..] [info]  [ 8448] Starting service...
[..] [info]  [ 8448] Service started in 15 milliseconds.

同じくPIDが記載されたファイルがtest.pidとして作成されます。また、プロセスとしてはcmd.exeとして見えています。

PS > ps

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
...
    246       9     4372       8448       0.06   4594   0 cmd
...

終わりに

systemdでは停止時にSIGTERMを送ることで簡潔に起動停止をしていますが、Windowsの場合はこのようなひと手間が必要となります。
特に停止時のpidファイルの扱いが特殊なので、実際に実環境で起動停止をすることでイメージが掴めると思います。

以上、ご参考になれば幸いです。