自作アプリをデーモン化したいときいつもrcスクリプト書いてたんだけど、
さすがにこれだけ需要あって、ツールないわけないでしょう、と今更思い立って
探してみました。
結果的に、自分が検索した範囲だと
- commons-daemon(javaアプリをデーモン化するライブラリ)
- supervisord(python製のユーザプログラムをデーモン化してくれるデーモン)
の2種類がよく出てきて、java製アプリ以外でも
対応できそうなsupervisordのほうを採用しました。
手順
以下にインストール後に行った手順を残しておきます。
OSはAmazonLinux(amzn-ami-hvm-2016.09.0.20161028-x86_64-gp2 (ami-0c11b26d))
です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# install supervisor $ sudo pip install supervisor # create configure file $ sudo touch /etc/supervisord.conf # create extra configure file's directory $ sudo mkdir /etc/supervisord.d # create log file's directory $ sudo mkdir /var/log/supervisor/ # edit supervisord.conf $ sudo vi /etc/supervisord.conf # Download supervisor rc script sudo curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec |
インストールしたあとは、設定ファイルと追加読み込み設定ファイル用ディレクトリを
作成してあげます。
その後、設定ファイルを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[supervisord] # log directory logfile=/var/log/supervisor/supervisord.log # pid file pidfile=/var/run/supervisord.pid [supervisorctl] serverurl=http://127.0.0.1:9001 username = hoge password = 123 prompt = mysupervisor # 追加設定ファイル読み込み [include] files = supervisord.d/*.ini |
ここまでやると
1 2 |
$ sudo /etc/init.d/supervisord start |
で起動できます。ただ、起動時に勝手に立ち上がってほしいので
chkconfig
に登録します。
1 2 |
$ sudo chkconfig --add /etc/init.d/supervisord |
これでOK
Play frameworkアプリケーションをデーモン化してみる
Play frameworkでのアプリケーションはactivator dist
ですが、
それで作成されたzipファイルを展開して、デーモン化してみます。
1 2 3 4 5 6 7 |
$ unzip play_app.zip $ cd play_app $ pwd > /home/ec2-user/play_app $ ls > bin conf lib logs README.md share |
ディレクトリ構造はこんな感じになってます。
このディレクトリ構造に倣って、supervisordの設定ファイルを書いてゆきます。
(/etc/supervisord.d/play_app.iniとして配置します。)
1 2 3 4 5 6 7 8 9 10 11 12 |
[program:MY_PLAY_APP] process_name=%(program_name)s directory=/home/ec2-user/play_app command=/bin/bash -c "ulimit -n 10240; exec bin/play_app -Dhttp.port=9000 -Dconfig.resource=application-stg.conf -Ddb.default.migration.auto=true -Dpidfile.path=/dev/null" autostart=true autorestart=true user=ec2-user redirect_stderr=true stdout_logfile=/home/ec2-user/play_app/logs/%(program_name)s.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=10 |
こんな感じ。
プロセスはSupervisorに管理してもらうので、PIDファイルは/dev/null
に捨ててしまいます。
必要あれば設定ファイルやポートを渡してあげます。
これで$ sudo /etc/init.d/supervisord restart
すればplay_appが起動します。
課題
- supervisorctl全然使ってないし、わかってない
- 実はchefレシピを書いたんだけど、AWSでしか動かない
- pip installで入れたsupervisorのパスがディストリごとで違う
- 公式のsupervisorレシピで解決できるならこっちでいいかも
この辺はもし機会があれば。