#281 Foreman
Ryan Batesが最近Twitterで、Railsアプリケーションの開発モード(development mode)で、依存するバックグラウンドプロセスを管理する最善の方法は何かと質問を投げかけました。何人かがForemanを推奨していたので、今回のエピソードで紹介します。
例えばRyanのGoVsGoアプリケーションを開発に利用するには、事前にいくつかのバックグラウンドプロセスを起動する必要があります。この中には、Beanstalkd、script/worker
プロセス、Fayeサーバが含まれます。開発でこのアプリケーションを使用するたびに、これらすべての起動作業が発生します。これらのプロセスすべてを簡単に管理する方法があればとても便利でしょう。そこでForemanの登場です。
Foremanのインストールと使用
Foremanはgemの形で提供され、通常の方法でインストールします。
$ gem install foreman
Foremanは管理対象のプロセスを、 RailsアプリケーションのrootディレクトリにあるProcfile
というファイルから読み込むので、このファイルを作成します。このファイルに、Foremanに管理させたいプロセスのリストを記述します。各プロセスの定義は、名称、コロン、起動したいプロセス名という形式なので、今回の対象の3つのプロセスを以下のように記述します。
beanstalk: beanstalkd worker: ./script/worker faye: rackup faye.ru -s thin -E production
Procfile
が完成したら、内容が正当かどうかをforeman check
コマンドを実行してチェックします。
$ foreman check valid procfile detected (beanstalk, worker, faye)
名称とコマンドの間の区切りをスペースではなくタブにするとdeprecationエラーが表示されるので、Procfile
を記述するときは留意しておいてください。ファイルが正当であることが確認できたら、foreman start
コマンドでForemanを起動してみます。
$ foreman start 20:06:35 beanstalk.1 | started with pid 23140 20:06:35 worker.1 | started with pid 23141 20:06:35 faye.1 | started with pid 23143 20:06:36 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:06:36 faye.1 | >> Maximum connections set to 1024 20:06:36 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:06:38 worker.1 | [2011-08-29 20:06:38 +0100] Working 1 jobs: [ Game.move ]
するとProcfile
で指定した各プロセスが実行され、その出力と一緒にターミナルにリスト表示されます。ターミナルウインドウでCTRL+C
をタイプするとプロセスが停止します。
Foremanには便利なマニュアルページがあり、機能や指定できるオプションについての説明があるので、ここでいくつか見てみます。プロセスを1つだけ起動したい場合はその名称を直接指定します。
$ foreman start faye 20:35:41 faye.1 | started with pid 23322 20:35:41 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:35:41 faye.1 | >> Maximum connections set to 1024 20:35:41 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop
プロセスのコピーを複数起動させたい場合は、-c
フラグを使用します。例えば4つのworkerプロセスを起動したい場合は、foreman start -c worker=4
を実行します。
$ foreman start -c worker=4 20:39:41 beanstalk.1 | started with pid 23366 20:39:41 worker.1 | started with pid 23368 20:39:41 worker.2 | started with pid 23370 20:39:41 worker.3 | started with pid 23372 20:39:41 worker.4 | started with pid 23374 20:39:41 faye.1 | started with pid 23376 20:39:42 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:39:42 faye.1 | >> Maximum connections set to 1024 20:39:42 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:39:46 worker.3 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.1 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.2 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:47 worker.4 | [2011-08-29 20:39:47 +0100] Working 1 jobs: [ Game.move ]
このコマンドで、すべてのプロセスが1回起動され、workerのみ4回起動されます。
プロセスをエクスポートする
Foremanにはexport
コマンドがあり、本番のサーバで使用できるフォーマットでプロセスのリストをエクスポートするときに便利です。現在はinittab
とupstart
フォーマットがサポートされています。foreman export upstart .
を実行すると、Foremanがカレントディレクトリにいくつかのupstart 用設定ファイルを書き出します。その一つを見てみると、そのファイルがbeanstalkd
を起動するコマンドを実行しログを処理することがわかります。
start on starting govsgo-beanstalk stop on stopping govsgo-beanstalk respawn exec su - govsgo -c 'cd /Users/eifion/govsgo; export PORT=5000; beanstalkd >> /var/log/govsgo/beanstalk-1.log 2>&1'
Foremanに関する今回のエピソードは以上です。今回はいつものエピソードよりも短めでしたが、Foremanは特定の問題を解決するシンプルなツールで、その仕事をうまくこなしてくれます。Railsアプリケーションを、開発モードで稼働状態にするためにいくつものプロセスを起動させなくてはいけないというときには、Foremanの利用を検討する価値があるでしょう。