デーモンプログラムを作るにあたって Apache Commons Daemon を使いましたので手順などをまとめておきます。デーモンプログラムとは起動したらバックエンドで動き続けるプログラムのことです。
事前準備
Apache Commons のサイトからBinariesとSourceをダウンロードしてください。ダウンロードしたらファイルを解凍しておきます。
$ 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ですが次の画像のようなイメージです。
パッケージ(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