君の瞳はまるでルビー - Ruby 関連まとめサイト

foreman について

最終更新: 2015-03-31 (火) 21:53:12 (753d)

複数のプロセスを管理する Ruby 上のツール/ライブラリです。

foreman のメインサイトを読んだだけではわからないことがたくさんあったので、 foreman のソースを実際に読んで情報を得ている部分があります。

Heroku でプログラムを動かす場合、foreman は基本構成技術の1つになります。

foreman をインストールする

以下のコマンドを実行して foreman gem をインストールします。

gem install foreman

Procfile を書く

Procfile というファイルに起動するアプリケーションを一覧で書きます。

書式は以下の通りです。

アプリケーション名1: コマンド1
アプリケーション名2: コマンド2
※ ... 以下、いくつでも追加してください。
※ コロンとコマンドの間には「スペース」を入れてください。
  • アプリケーション名について
  • アプリケーション名は任意です。アプリケーション名には、アルファベットと数字とアンダーバーが使えます。
  • アプリケーション名に同じ名前は使えません。
  • web, worker, clock という名前が使われている例が多く紹介されていますが、単なる慣習であり制約があるわけではありません*1
  • コマンドについて
    • シェルで実行可能なコマンドは指定可能です。
    • 任意のコマンドが指定可能とは言え、環境に依存しないよう gem でインストールした以下のようなコマンドを利用するのが慣習です。
    • foreman は個々のコマンドを Kernel#forkKernel#exec で子プロセスとして起動します。
    • $PORT という変数が使えます。$PORT は foreman が自動で割り振ります。
      • 標準ではコマンド1には 5000 がコマンド2には 5100 が、続いて同じように 100 毎に割り当てられます。
      • 開始ポート番号をコマンドのオプションで変更できます。
      • $PORT を利用せずコマンド上に直接ポート番号を書いてももちろん良いですが、$PORT を利用した方が汎用的です。理由は次の節を読むとわかります。
    • コロンとコマンド名の前にスペースを入れてください
      • foreman の実装(0.39.0)を見る限りスペースは不要です。実際にローカルではスペースを入れても入れなくても動作します。
      • しかし、heroku で動作させた場合、スペースが無いとその行を認識してくれないので、heroku とは無関係であっても将来性を考えてスペースを入れて置くと良いでしょう。
    • 改行コードに注意してください
      • 環境によっては改行コードの違いで動かない場合があります。
      • heroku 環境を利用する場合、改行コードは LF でなければなりません。

Procfile に書いたアプリケーションを起動する

以下のコマンドで Procfile に書いたアプリケーションを起動します。

foreman start

foreman コマンドには2つのオプションがあります。

コマンドの並列実行プロセス数を指定する(-c, --concurrency)

コマンド毎に並列実行プロセス数を指定できます。以下に例を示します。

  • Procfile
app1: command1
app2: command2
app3: command3
foreman start -c app1=2,app2=0

この場合、コマンドは以下のように実行されます。

コマンドプロセス数
command12(並列実行)
command20(=未実行)
command31

command1 が独立したポートを必要としているときに $PORT が役立ちます。$PORT は以下のように割り当てられます。

プロセス$PORT の値
1 つめの command1 プロセス5000
2 つめの command1 プロセス5001
command3 プロセス7000*2

このように独立したポートが必要なとき*3に $PORT を利用することで汎用性が保たれます

$PORT の開始番号を指定する(-p, --port)

標準では $PORT は 5000 から始まります。しかし、以下のように指定すると 6000 から始まるようになります。

foreman start -p 6000

foreman は、主に Web アプリケーションと非同期/定期処理とを並列動作させる目的で使われます。

その場合、Procfile の先頭に Web アプリケーションを書くという慣習があります。それは Web アプリケーションが利用するポート番号がわかりやすいからです。

foreman を止める

foreman を正式に止めるには、foreman のプロセスに SIGTERM を送信してください。

foreman は起動した個々のプロセスに対して SIGTERM を送信し、全てのアプリケーションを終了します。

その他

foreman には関連するアプリケーション用の設定ファイルを出力するエクスポート機能があります。

今のところそこには触れません。必要になったら調べます。bluepill ってなんでしょう?知っている人が居たらコメント下さい。

コメント

本ページの内容に関して何かコメントがある方は、以下に記入してください。

コメントはありません。 コメント/foreman/about

お名前: