Apache Commons Daemonを使ってJavaのデーモンプログラムを作る

スポンサーリンク

デーモンプログラムを作るにあたって Apache Commons Daemon を使いましたので手順などをまとめておきます。デーモンプログラムとは起動したらバックエンドで動き続けるプログラムのことです。

事前準備

 Apache Commons のサイトからBinariesSourceをダウンロードしてください。ダウンロードしたらファイルを解凍しておきます。

$ tar zxvf commons-daemon-1.0.15-bin.tar.gz
$ tar zxvf commons-daemon-1.0.15-src.tar.gz

今回用意するのはデーモン実行に必要なjsvcと実際に動かすJavaプログラムです。

jsvcのビルド

jsvcのビルド手順は  Daemon : Java Service に書かれている通り実行していきます。

まず先程解凍したファイルのディレクトリに移動します。

$ cd commons-daemon-1.0.15-src/src/native/unix/

次のシェルスクリプトを実行します。

$ sh support/buildconf.sh
support/buildconf.sh: configure script generated successfully 

環境変数JAVA_HOMEを設定するか、--with-java=/user/local/javaのようにオプションを付けて./configureを実行してください。

$ ./configure
...
*** All done ***
Now you can issue "make"

最後に表示されたメッセージの通りmakeを実行すると、カレントディレクトリにjsvcが作成されているはずです。

$ make

補足:Mac OS X の場合

上記の方法で作成したjsvcはCentOSの場合は動くことを確認しましたが、Macの場合は次のようなエラーが出てデーモン実行ができませんでした。

Cannot find any VM in Java Home /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
Cannot locate JVM library file
Service exit with a return value of 1

とりあえずMacはHomebrewでjsvcをインストールするとうまく動きましたのでこれで実行しておきます。ログ見てみると2ファイルほどPatchをあててるのでそれが原因かもしれないです。

$ brew install jsvc
==> Downloading http://archive.apache.org/dist/commons/daemon/source/commo
Already downloaded: /Library/Caches/Homebrew/jsvc-1.0.15.tar.gz
==> Patching
patching file unix/native/java.c
patching file unix/native/location.c
==> ./configure --with-java=/System/Library/Frameworks/JavaVM.framework --
==> make
🍺 /usr/local/Cellar/jsvc/1.0.15: 6 files, 80K, built in 2 seconds

デーモンプログラムの作成

まずプログラム用のディレクトリを作ります。commons-daemon-1.0.15-bin.tar.gzを解凍したディレクトリにあるcommons-daemon-1.0.15.jarを作成したディレクトリのlib配下にコピーしてビルドパスに追加します。Eclipseですが次の画像のようなイメージです。

f:id:tasukujp:20150406015804p:plain

パッケージ(com.tasknotes.daemon)を作成して、その中にorg.apache.commons.daemon.Daemonを実装したJavaプログラムを作成します。例として次のようなコードです。デーモンが起動してる間、数字をカウントアップして出力し続けるだけのものです。

 ApacheCommonsDaemon - GitHubGist

出来たらプロジェクトをjarファイルにしますが、Eclipseの場合は「プロジェクトを選択して右クリック -> エクスポート -> Java - JARファイル -> エクスポート先を選択して完了」でjarファイルを作成できます。

起動スクリプトの作成

コマンド実行だけでも動かせますが、ついでなので/etc/init.dに起動スクリプトを作ります。

 ApacheCommonsDaemon - GitHubGist

権限を変えておきます。

$ chmod 755 /etc/init.d/jsvcd

コマンドだけで実行したい場合は次の通りです。

jsvc -home <JAVA_HOME> -cp <CLASS_PATH> -user <User> -outfile <FILE_PATH> -errfile <FILE_PATH> -pidfile <FILE_PATH> <PROGRAM> ( -stop )

デーモンの実行

作成した起動スクリプトにstartの引数を与えて実行します。

$ sudo /etc/init.d/jsvcd start
Starting the TestDaemon service...
The TestDaemon service has started.

コマンドの-outfile $LOG_OUTで指定したファイルに数字が出力されていけば成功です。もしエラーが出てる場合は-errfile $LOG_ERRに出力されます。

$ sudo tail -f /usr/local/testdaemon/testdaemon.out
0
1
2
3
...

デーモンのプロセスIDが記録されています。

$ sudo cat /var/run/mydaemon.pid
17944

停止する時はstopの引数で実行します。

$ sudo /etc/init.d/jsvcd stop
Stopping the TestDaemon service...
The TestDaemon service has stopped.

PIDファイルも削除されました。

$ sudo cat /var/run/mydaemon.pid
cat: /var/run/mydaemon.pid: No such file or directory

参考サイト

 Creating a Java Daemon (System Service) for Debian using Apache Commons Jsvc | Neilson

 [DAEMON-281] Jsvc not loading correct shared lib for Java 7 on MacOS - ASF JIRA