技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Playframework2.2.1 の dist されたアプリを Ubuntu13.10 でサービス化する

適当なサンプルアプリを作る。

play new sample

で、それを dist する。

play dist

すると、下記が出来上がる。

sample/target/universal/sample-1.0-SNAPSHOT.zip

アプリケーション名-バージョン.zip

これを適当にサービス化できそうなディレクトリに展開する。

sudo unzip path/to/sample-1.0-SNAPSHOT.zip -o /opt

で、/opt/sample-1.0-SNAPSHOT/bin/sample を叩くと起動するのだが、いかんせん forground で起動するのでウザい。

そしてどうにもバックグラウンド起動するオプションがなさそうだった(知ってる人是非コメントお願いします)。

で、起動スクリプトを書く。

Ubuntu とか Debian 系のサービススクリプトの書き方は、どうも Cent 系とは異なるらしい、、、、。結構そこを明記せずに Blog に書く人が多いので注意が必要。

とりあえず Ubuntu には /etc/init.d/skeleton があるので、これをコピって作ることにした。

sudo cp /etc/init.d/skeleton /etc/init.d/play

そしたら vim あたりで /etc/init.d/play を開いて

#! /bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="play"
NAME=sample
DAEMON=/opt/sample-1.0-SNAPSHOT/bin/sample
PIDFILE=/opt/sample-1.0-SNAPSHOT/RUNNING_PID
SCRIPTNAME=/etc/init.d/play

[ -x "$DAEMON" ] || exit 0

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

. /lib/init/vars.sh

. /lib/lsb/init-functions

do_start()
{
        start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -b
}

do_stop()
{
        start-stop-daemon --stop --pidfile $PIDFILE
}

do_reload() {
        start-stop-daemon --stop --signal 1 --pidfile $PIDFILE
        return 0
}

一応 start-stop-daemon の man ページを見ると、-b は最後の砦らしいので注意が必要。

普段 Ubuntu メインで使わないので、Playframework2.2.1 のサービス化を自動化するコマンドやライブラリが無いか 2h 探して(1.x 系のが沢山かかるのでノイズが酷いから注意)断念。

次に Playframework アプリを Ubuntu の ServiceScript に登録できるようなライブラリやツールが無いか探して 2h (ありそうな気がするけど、キーワードの組み合わせが予想しきれず断念)探して断念。

最後に Ubuntu の起動スクリプトを自前で作ろうと決断して、スケルトンを見つけるのに 1h (こっちは皆 Linux 用としか書かれてなくて、dist 違いで使えないもの多数)。出来上がったのがこれ。

たかがこれだけの事に 5h とかストレスマッハで、絶対にやりたくないと思ったので、検索にかかりやすいキーワードでBlog化。

試してないけど、Debian 系ならこのままいけるはず。

下手に Chef とか知ってると「誰かしらやってるんじゃないか?」と思ってしまうのが運がないとしか言えない。