Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Play framework 2.0でデーモン化する方法

commons-daemonの依存関係を追加する

次のようにproject/Build.scala を編集する。

object ApplicationBuild extends Build {
    // ...
    val appDependencies = Seq(
      "commons-daemon" % "commons-daemon" % "1.0.10"
    )
    // ...
}

play eclipsifyなどを実行してcommons-daemonへのビルドパスを通す

Eclipseの人は

$ play eclipsify

IntelliJの人は

$ play idea

その他の人は

$ play compile

とかでいいと思う。

Daemonインターフェイスを実装したApplicationクラスを用意する

次のクラスをplay new で生成したプロジェクト内に用意します。

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) {
    // DaemonContextのargumentsからパラメータを受け取ればよい。commons-cliを使ってもよいね。
    applicationPath = new File(dc.getArguments()(0))
  }

  override def start {
    // NettyServerに渡しているパラメータはもっとかっこ良くできるけど、とりあえず版
    nettyServer = new NettyServer(
      new StaticApplication(applicationPath),
      Option(System.getProperty("http.port")).map(Integer.parseInt(_)).getOrElse(9000),
      Option(System.getProperty("http.address")).getOrElse("0.0.0.0"))
  }

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

  override def destroy {
    nettyServer = null
  }

}

配布パッケージを作る

$ play dist

distファイルを展開する

$ cd dist
dist$ unzip app-1.0-SNAPSHOT.zip
dist$ cd app-1.0-SNAPHOST

jsvcと起動スクリプトを用意する

commons-daemon内のjsvcをビルドする

jsvcは次のURLのcommons-daemon-1.0.10-native-src.tar.gzです。 http://commons.apache.org/daemon/download_daemon.cgi

ビルド方法は次のとおり。jsvcができるのでapp-1.0-SNAPHOSTにコピー。

$ support/buildconf.sh
$ ./configure
$ make

詳しくはここ。http://commons.apache.org/daemon/jsvc.html

起動スクリプトを用意する

以下スクリプトをdaemon.shとしてjsvcを同じディレクトリに配置する。

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

BACKUP_DIR=`pwd`

cd `dirname $0`
CUR_DIR=`pwd`

start()
{
./jsvc \
        -home $JAVA_HOME \
        -cp $CLASSPATH \
        -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

デーモンとして起動・停止する

以下のコマンドでデーモンを起動停止する。

$ sh daemon.sh start
$ sh daemon.sh stop
@xuwei-k

This comment has been minimized.

Show comment
Hide comment
@xuwei-k

xuwei-k Mar 22, 2012

Option(System.getProperty("http.port")).map(Integer.parseInt(_)).getOrElse(9000)

などは、2.9.0以降ならば

sys.props.get("http.port").map(_.toInt).getOrElse(9000)

とかも

xuwei-k commented Mar 22, 2012

Option(System.getProperty("http.port")).map(Integer.parseInt(_)).getOrElse(9000)

などは、2.9.0以降ならば

sys.props.get("http.port").map(_.toInt).getOrElse(9000)

とかも

@j5ik2o

This comment has been minimized.

Show comment
Hide comment
@j5ik2o

j5ik2o Mar 22, 2012

おお、いいすね。Play2.0のコードをそんままひっぱてきたのでw

Owner

j5ik2o commented Mar 22, 2012

おお、いいすね。Play2.0のコードをそんままひっぱてきたのでw

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment