理系学生日記

おまえはいつまで学生気分なのか

任意のプログラムをWindowsサービスとして構成する

Windows で Java のデーモンをサービスとして起動させときたかったんですが、なんか良いものないかなと思ったら winsw というのを見つけました。

作者は Jenkins の川口耕介さんであり、もともと winsw も Jenkins を念頭に作成されたらしいです。 実際に GitBucket を動かしてみたところ、問題なくサービス化できています。

手順

Github 上にインストールガイドがあるので、それに従えば良いと思います。 というのも乱暴かもしれませんので、以下に概要を記載しておきます。ここでは、prg というプログラムをサービス化するという前提で記載します。

  1. winsw.exe をダウンロードして、prg.exe にリネームする
  2. 設定ファイルとして、prg.xml を作成する (後述)
  3. prg.exeprg.xml を同じフォルダに配置する
  4. コマンドラインで、prg.exe install を実行する。これで Windows に prg がサービス登録される。

あとは、Windows Service Manager を使って、Windows の起動に合わせて起動をかける等、通常のサービスと同様に設定が可能になります。

設定ファイル

以下が Jenkins 用のサンプル設定。

<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <description>This service runs Jenkins continuous integration system.</description>
  <env name="JENKINS_HOME" value="%BASE%"/>
  <executable>java</executable>
  <arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
  <logmode>rotate</logmode>
</service>

書いてあることはだいたい読めば分かりますが、上で記述されている中で分かりづらいものがあるとすると、BASE くらいかと思います。

  • BASE: winsw.exe (をリネームしたもの) が配置されているディレクトリ。環境変数として扱われるので、%BASE% で値が参照できる。

結構細かな設定が可能でして、

  • 作業ディレクトリ
  • サービスから出力されるログの扱い (ローテーション等)
  • サービス起動時のタイムアウト
  • 起動時に設定ファイル等をダウンロードできる (auto update)

とかが可能です。

Windows で何かデーモン的なものを立ち上げるときには、採用を検討しても良いのではないでしょうか。