Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Created March 22, 2012 05:41
Show Gist options
  • Save j5ik2o/2156447 to your computer and use it in GitHub Desktop.
Save j5ik2o/2156447 to your computer and use it in GitHub Desktop.
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
Copy link

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
Copy link
Author

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