Linux Foreman 是干什么的? 为什么不用 systemd ?

xiaoronglv for Workstream · 2021年10月14日 · 最后由 Rei 回复于 2021年10月17日 · 974 次阅读

我在看一些项目的部署文档时,有些人提到了 Foreman,看样子它是用来守护进程的。比如 puma/sidekiq/racecar 之类的进程挂了,foreman 可以自动把它们启动。

https://github.com/zendesk/racecar#deploying-consumers

If you're already deploying your Rails application using e.g. Capistrano, all you need to do to run your Racecar consumers in production is to have some process supervisor start the processes and manage them for you.

Foreman is a very straightford tool for interfacing with several process supervisor systems. You define your process types in a Procfile, e.g.

racecar-process-payments: bundle exec racecar ProcessPaymentsConsumer racecar-resize-images: bundle exec racecar ResizeImagesConsumer

问题

  1. foreman 可以守护其他进程, 如果 foreman 自己挂了,谁把它启动啊?
  2. 为什么大家不直接用 systemd?
  3. foreman 出生时,systemd 还没诞生(或成熟)吗?

熟悉 Linux 的朋友,可以讲一讲历史岁月吗?

foreman 的配置文件比较简单, 使用起来挺方便的

Foreman 应该是最早受到了 Heroku 的影响(Heroku 是用 Procfile 管理用户项目所需服务的),开发的时候如果有一堆要起,用 Foreman 也比较方便。

我的理解是 foreman 是帮你一个指令起 application 所需的所有服务的东西, 能统一配置环境啥的 没说可以管理 puma sidekiq 等服务挂不挂

守护进程的话我记得 ruby 是用 god , 但是 god 本身也需要跑在 daemon

systemd 的好处就是统一了各种语言, 直接按规定的写

感觉 foreman 主要用于开发阶段 systemd 用于部署阶段

foreman 是开发环境用的,作者曾经在 heroku 工作,所以 Profile 和 heroku 的格式一样。

生产环境应该 export 到系统的管理配置,例如 upstart,stystemd http://ddollar.github.io/foreman/#EXPORT-FORMATS

foreman 诞生的时候 systemd 还没成为主流。

capistrano-foreman

cap production foreman:export

Capfile

require 'capistrano/foreman'

lib/capistrano/tasks/foreman.rake

after 'deploy:finished' do
  invoke 'foreman:export'
  invoke 'foreman:restart'
end

拿走不谢 😏

xinyifly 回复

非常感谢你提供使用方法,但我问题是 “为什么用 foreman?它和 systemd 的渊源是什么?”

此外我不打算使用它,有两点原因。

1. capistrano-puma 和 capistrano-sidekiq 都提供了脚本生成 systemd 文件, 我感觉没有必要再引入一个 gem 做抽象。

cap production sidekiq:install
cap production puma:systemd:config

2. 我基本上不会在本地起守护进程,通常都是开一个新的 terminal 的 tab,然后运行 bundle exec sidekiq

你通常会在本地使用 foreman 吗?

@Rei @jicheng1014

按时间顺序,foreman 确实在 systemd 成熟之前,(那时候生产很多用 monit,sidekiq 还是自带 daemon,终于等到 systemd 成熟 sidekiq 等库在新版设计时候也去掉了自身的 daemon 机制,推荐用系统自带的机制);

linux 从原来的 init 机制,争议 systemd 是否管太多,切换到 systemd,再 systemd 支持 user level unit 等逐渐成熟,这个过程前有很多其它 daemon 方案,现在生产用 systemd 应该比较成熟了 (用容器是另一套方案)

foreman 方便本地开发(我本地会用),方便一键启关联服务,避免多终端看日志不方便等,好像 rails 7 默认的./bin/dev 执行的就是 forman start

xiaoronglv 回复

现在开发环境已经需要四个进程,Rails,sidekiq,scss,esbuild,另开终端已经显得麻烦了。

Rails css/js-buundling 默认用 foreman 启动开发进程,因为 foreman 是 Ruby gem。

对我来说 docker 是更好的选择,开发环境用 docker compose,生产环境用 docekr swarm。

我记得 foreman 可以生成 systemd 的配置文件

xiaoronglv 回复

foreman:export 会在服务器生成各个 foreman 任务相关的 systemd 配置。

我的理解是, Rails 项目需要管理的进程除了 puma, sidekiq ,可能还会有一系列用户编写的常驻进程,以 Procfile 的方式提供启动指令(比如监听 MQTT/RabbitMQ 的 worker )

xinyifly 回复

本地用 foreman 的目的不是起守护进程,好处是 1.声明项目所有服务,是一个可执行的文档 2.统一 start stop 项目依赖的服务 3.开发环境和生产环境兼容

foreman 和 Supervisor 在用途上有什么区别?

延伸一下这个问题。 如果都已经使用 docker, 那么还有人在使用 rvm 管理 ruby veesion,或者 rvm-gemset 隔离 gem list 吗?

@Rei @xiaoronglv

charlie_hsieh 回复

没有必要了吧。除非你打算把 docker 当虚拟机用。。。我见过在 docker 里先装 linux, 再装 rbenv,再装 ruby 的情况(当然还有一大堆依赖),整个镜像大概 4G。完全不理解这样搞的好处。

Rei 回复

我这边不太喜欢用 foreman 的原因是 我偶尔会在代码里加入 byebug 来进行调试

foreman 好像在遇到 byebug 的时候 没办法进行交互

charlie_hsieh 回复

不用,我用 ubuntu 镜像然后装源里面的 ruby。如果需要特定 ruby 版本就用 ruby 的镜像。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号