commons-daemon 1.0.15でPlay 2.2アプリをデーモン化する

以下で紹介されている方法ですが、Play 2.2およびcommons-daemonの最新版である1.0.15だと少し変わっていたのでメモ。

build.sbtに以下の依存関係を追加。

"commons-daemon" % "commons-daemon" % "1.0.15"

Daemonインターフェイスを実装したApplicationクラスを用意します。NettyServerのインターフェースが少し変わっています。

package daemon

import org.apache.commons.daemon.Daemon
import org.apache.commons.daemon.DaemonContext
import play.core.server.NettyServer
import play.core.StaticApplication
import java.io.File

class Application extends Daemon {

  var nettyServer: NettyServer = _
  var applicationPath: File = _

  override def init(dc: DaemonContext) {
    applicationPath = new File(dc.getArguments()(0))
  }

  override def start() = {
    nettyServer = new NettyServer(
      appProvider = new StaticApplication(applicationPath),
      port        = Some(Option(System.getProperty("http.port")).map(Integer.parseInt).getOrElse(9000)),
      address     = Option(System.getProperty("http.address")).getOrElse("0.0.0.0"))
  }

  override def stop() = {
    if (nettyServer != null) nettyServer.stop()
  }

  override def destroy() = {
    nettyServer = null
  }
}

あとは冒頭の記事と同じくjsvcをコンパイルして起動スクリプトを用意します。commons-daemon 1.0.11から-cwdというオプションで実行ディレクトリを指定するようになっています(省略した場合、ルートディレクトリが実行ディレクトリになります)。

#/bin/sh
CLASSPATH=.:./lib/*
PID_FILE=./pidfile

BACKUP_DIR=`pwd`

cd `dirname $0`
CUR_DIR=`pwd`

start()
{
./jsvc \
        -home $JAVA_HOME \
        -cp $CLASSPATH \
        -cwd ./ \
        -pidfile $PID_FILE \
        -Dlogback.configurationFile=./logback.xml \
        -debug -verbose \
        -outfile stdout.log \
        -errfile '&1' \
        daemon.Application $CUR_DIR
}

stop()
{
./jsvc \
        -stop \
        -pidfile $PID_FILE \
        daemon.Application
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  *)
        echo "Usage $0 start/stop"
        exit 1;;
esac

cd $BACKUP_DIR

とりあえずこんな感じで。