17854


[ddollar/foreman](https://github.com/ddollar/foreman)についてです。

## ジョブ, プロセス

[David Dollar](http://blog.daviddollar.org/2011/05/06/introducing-
foreman.html)

> My apps no longer consist of a single web process; I usually have have  
>  one or more types of background workers to run different types of jobs  
>  and a clock process to handle scheduling.

種類の違う **バックグラウンドで動くジョブ** をスケジューリングしているというようなことが書いてあります。

[Foreman as Process Manager](https://robots.thoughtbot.com/foreman-as-process-
manager)  
ここにも **Process Manager** とあり、 **ジョブ** のことを **プロセス** とも呼んでいるものと考えます。

### 具体的にジョブ, プロセスとは？

[Using foreman and environment variables to isolate and run your apps in
development - Maurício Linhares'
ramblings](http://mauricio.github.io/2014/02/09/foreman-and-environment-
variables.html)

> If you’re building Rails apps you probably found yourself installing  
>  many external dependencies to run it. A database, a full text search  
>  engine, an in memory cache, background worker processes and many other  
>  tools that run as separate processes in your machine.

とあるので、具体的に **ジョブ** や **プロセス** と呼ばれているものは、  
データベースやフルテキストサーチエンジンやキャッシュと理解しました。

### 具体的なソフトウェアで考えると...

上記では、データベースやキャッシュなどと表記されていますが、具体的なソフトウェアの名前を上げると、`MySQL`,`PostgreSQL`,`Redis`,`Unicorn(これもforemanの扱う対象？）`といったものが上がると思います。

## Process Manager？

iPhoneアプリ開発では`Objective-C`を用い非同期処理を実現するために、`GCD`を使ったりして処理の制御を頻繁にしておりました。

`foreman`も似たようなことをしているのではないかと推測しているのですが、  
`PostgreSQL`,`Redis`,`Unicorn`というものを`foreman`が管理するというのがいまいち想像がつきません。`PostgreSQL`,`Redis`,`Unicorn`といったものを個別に立ち上げても`OS`がプロセスを扱う役目を担っているはずですので、`foreman`がいったい内部でどのようなことをしていてどのようなメリットがあるのでしょうか？


CC BY-SA 3.0
2015-10-20T00:33:51.557
17831
2019-04-04T04:47:22.550
2015-10-20T11:44:40.603
9008
9008
question
ruby-on-rails ruby rubygems foreman
foremanとはなんでしょうか　使う利点は？


Railsアプリを開発するとき、ウェブサーバーのプロセスを1つ立ち上げて開発出来るのであればforemanは必要ありません。

しかし、開発をすすめるうち、ウェブサーバー以外にも以下のように`rails
s`で立ち上げるウェブサーバー以外にも、同時に実行しておかないといけないプロセスがいくつも出てきます。

  * バックグラウンドでジョブを実行するためのワーカープロセス
  * ワーカープロセスに定期的/ある特定の時間に処理を実行してもらうため、適切なタイミングでワーカープロセスにジョブを渡すためのクロックプロセス
  * ウェブ/ワーカー/クロックプロセスから、ジョブをエンキューするためのキュー
  * Railsで管理していないアセットをビルドするためのプロセス

## 具体的なソフトウェアの例

一例ですが、僕がいま開発しているアプリを実行するためには、以下のコマンドを実行して5つのプロセスを同時に立ち上げる必要があります。

  * bundle exec rails s
  * bundle exec sidekiq -c 1
  * bundle exec clockwork lib/clock.rb
  * gulp watch
  * redis-server

※僕の場合はデータベースは常時立ち上げているのでforemanで管理していません

### foremanを使わない場合

  * これらのプロセスを1つ1つ手でコマンドを実行して立ち上げる
  * デバッグで標準出力をみたいときにはこれらのプロセスの標準出力を1つ1つ見に行く
  * 全ての開発者がこれらのコマンドを手で実行する
  * このアプリケーションの実行に必要なコマンドを足したときには他の開発者に知らせる

### foremanを使う場合のメリット

  * プロセスの種類と立ち上げるコマンドProcfileに書いておけば、foremanのコマンド一発でこれらのプロセスを立ち上げ開発を開始できる
  * 標準出力をまとめてみれるのでforemanのコマンドを実行した画面を見ればすべてのログがみれる
  * 開発しているアプリケーションを実行するために必要なコマンドをProcfileに書いておけば誰でもforemanのコマンド1つで実行できる
  * 開発しているアプリケーションを実行するために必要なコマンドが増えた場合も、Procfileに追加するだけで、誰でもforemanのコマンド1つで実行できる

### foremanがやってること

雰囲気はこの辺みるとわかると思います。

<https://github.com/ddollar/foreman/blob/59d87c91a2004e05f6b12d4b150dcb4c911eb31c/lib/foreman/engine.rb#L52,L62>


CC BY-SA 3.0
2015-10-20T10:57:12.933
17854
2015-10-20T10:57:12.933
2599
17831
answer


個人的に、 foreman を使う一番大きなメリットは、 Procfile に記述した内容をそのまま sysVinit/upstart/systemd
の形式で、デーモンとしてエクスポートできることだと思っています。

つまり、モダンなウェブアプリとは、複数のコマンドによって実行されるプロセス群が協調動作を行うことで、それが最終的な動作となりますが、それを、

  * 手元(development) ではただの複数プロセス起動ツールとして
  * production では、それらのプロセスをデーモン化してデプロイすることで

開発者は `Procfile` だけをメンテするだけで、 development/production
のプロセスの起動をいい感じにハンドルしてくれるツールが、 Procfile です。

例えば、 Heroku は app のプロセス群をチューニングする際には、 Procfile
を書いてくれ、というような文書があった記憶があります。おそらく、 heroku の裏側でも Procfile
から、それらをデーモン化する処理が行われているのだと思っています。


CC BY-SA 4.0
2019-04-04T04:47:22.550
53906
2019-04-04T04:47:22.550
754
17831
answer