はじめに
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ファイルの扱いが特殊なので、実際に実環境で起動停止をすることでイメージが掴めると思います。
以上、ご参考になれば幸いです。