2013年2月10日日曜日

Scala + Sbtでデーモンを作る方法



サーバーで動作を行うデーモンを、Scalaで書きます。

なお、環境はRHEL系のLinuxで動作を確認しました。それ以外のOSの方は
適宜読み替えてください。

また、ビルドなどはsbtを利用するので、「始めるsbt」などを読んでおくと
いいと思います。

1.Scalaのコードを書く


1.1 参照の追加


sbtを使ってアプリを構成します。今回、ApacheCommonDaemonを利用するので、
build.sbtに次のように参照を追加します。

libraryDependencies += "commons-daemon" % "commons-daemon" % "1.0.10"
view raw build.sbt hosted with ❤ by GitHub


1.2 Scalaのコードを書く


Daemonインターフェースを継承したクラスを書きます。
今回は次のようにしました。
package jp.numa08.main
import org.apache.commons.daemon._
class MyDaemon extends Daemon {
var daemonService:MyDaemonService = _
@throws(classOf[DaemonInitException])
@throws(classOf[Exception])
def init(context:DaemonContext){
daemonService = new MyDaemonService()
}
@throws(classOf[Exception])
def start(){
daemonService.start()
}
@throws(classOf[Exception])
def stop(){
daemonService.stop()
}
def destroy(){
}
}
view raw mydaemon.scala hosted with ❤ by GitHub

一応、例外を明示的に投げるように書いておいています。

1.3 実行可能ファイルを作る


sbt-assembkyを使って実行可能なjarファイルを用意しました。
sbt-assemblyについては、こちらの記事を参照してもらえると嬉しいです。

2. jsvcのセットアップ


2.1 ソースコードをダウンロードする

http://commons.apache.org/daemon/download_daemon.cgi

上記のURLから''native-src''をダウンロードします。

ビルド対象のコードは
jsvc/commons-daemon-1.0.12-native-src/unix
view raw jsvc_source.sh hosted with ❤ by GitHub
にあります。

2.2 ビルドに必要なライブラリ、ツール群をインストールする。


ApacheCommonDaemonのページによると次のツールが必要とのことです。
  • GNU AutoConf (at least version 2.53)
  • An ANSI-C compliant compiler (GCC is good)
  • GNU Make
  • A Java Platform 2 compliant SDK

yumなどを利用してインストールしましょう。

2.3 ビルド、インストールする


./configure
make
make install
view raw build.sh hosted with ❤ by GitHub

jsvc -help ができることを確認。

3. 起動する


起動スクリプトと終了のスクリプトを記述しました。
デーモンらしく,/etc/rc..d/init.d/以下に保存をすると
いいと思います。
MY_JARFILE=/usr/local/bin/my_daemon.jar
MY_PID_FILE=/usr/local/etc/my_daemon.pid
MAIN_CLASS=jp.numa08.main.MyDaemon
prog=my_daemon
RETVAL=0
start() {
echo -n $"Starting ${prog}:"
jsvc -home ${JAVA_HOME} -cp ${CLASSPATH}:${MY_JARFILE} -pidfile ${MY_PID_FILE} ${MAIN_CLASS}
RETVAL=$?
if [[ $RETVAL == 0 ]]; then
echo -e "\t\t [\033[1;32m OK \033[0m]"
else
echo -e "\t\t [\033[1;31m FAILED \033[0m]"
fi
return $RETVAL
}
stop() {
echo -n $"Stopping ${prog}"
jsvc -stop -pidfile ${CHOCOLA_PID} ${MAIN_CLASS}
RETVAL=$?
if [[ $RETVAL == 0 ]]; then
echo -e "\t\t [\033[1;32m OK \033[0m]"
else
echo -e "\t\t [\033[1;31m FAILED \033[0m]"
fi
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
start
stop
;;
*)
echo $"Usage: ${prog} {start|top}"
RETVAL=2
esac
exit $RETVAL
view raw my_daemon.sh hosted with ❤ by GitHub

4. 参考にしたWEBページなど

以下のページを参考にしました。
Play framework 2.0でデーモン化する方法
始めるSBT
SBTで実行可能なjarファイルを作る
Apche Commons Daemon