homeASCIIcasts

281: Foreman 

(view original Railscast)

Other translations: En Es He Fr

Other formats:

Written by Naomi Fujimoto

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つのプロセスを以下のように記述します。

/Procfile

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コマンドがあり、本番のサーバで使用できるフォーマットでプロセスのリストをエクスポートするときに便利です。現在はinittabupstartフォーマットがサポートされています。foreman export upstart .を実行すると、Foremanがカレントディレクトリにいくつかのupstart 用設定ファイルを書き出します。その一つを見てみると、そのファイルがbeanstalkdを起動するコマンドを実行しログを処理することがわかります。

/govsgo-beanstalk-1.conf

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の利用を検討する価値があるでしょう。