複数のプロセスを管理する 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#fork と Kernel#exec で子プロセスとして起動します。
- $PORT という変数が使えます。$PORT は foreman が自動で割り振ります。
- 標準ではコマンド1には 5000 がコマンド2には 5100 が、続いて同じように 100 毎に割り当てられます。
- 開始ポート番号をコマンドのオプションで変更できます。
- $PORT を利用せずコマンド上に直接ポート番号を書いてももちろん良いですが、$PORT を利用した方が汎用的です。理由は次の節を読むとわかります。
- コロンとコマンド名の前にスペースを入れてください。
- 改行コードに注意してください。
- 環境によっては改行コードの違いで動かない場合があります。
- heroku 環境を利用する場合、改行コードは LF でなければなりません。
Procfile に書いたアプリケーションを起動する
以下のコマンドで Procfile に書いたアプリケーションを起動します。
foreman start
foreman コマンドには2つのオプションがあります。
コマンドの並列実行プロセス数を指定する(-c, --concurrency)
コマンド毎に並列実行プロセス数を指定できます。以下に例を示します。
- Procfile
app1: command1 app2: command2 app3: command3
- foreman 起動コマンド
foreman start -c app1=2,app2=0
この場合、コマンドは以下のように実行されます。
コマンド | プロセス数 |
command1 | 2(並列実行) |
command2 | 0(=未実行) |
command3 | 1 |
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