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 とか知ってると「誰かしらやってるんじゃないか?」と思ってしまうのが運がないとしか言えない。