我如何启动 Redis,一个 Ruby 脚本和 Resque worker 作为一个守护进程

How do I start Redis, a Ruby script, and Resque worker as one daemon

我正在构建一个与一些内部工具集成的 Slack Bot。

我看到了这个解决方案:Trying to start redis and resque scheduler within a rake task

但是有没有更简洁的方法来做到这一点?

目前我正在另一个 ruby 脚本 start.rb 中开始一切,基本上是这样的:

system('nohup redis-server &')
system('nohup bundle exec ruby slack_bot.rb &')
system("nohup bundle exec rake resque:workers QUEUE=* COUNT=#{$workers} &")

通常这很好,但由于某些原因 slack_bot 有时会挂起。要重新启动,我必须终止那个进程并重新启动它。我宁愿有一种简单的方法来一起重新启动所有东西只是为了干净,本质上是守护进程。在一个完美的世界中,我可以 运行 这一切作为系统服务和 start/stop 与 service bot start/etc/init.d 或者有一个进程到 start/kill.

我猜您正在寻找 foreman gem。使用工头,您可以使用 Procfile 声明 运行 您的应用程序所需的各种流程。

所以,解决方案可以是:

1 gem 安装工头

2 在您的项目目录中创建 Procfile。放入文件:

redis: redis-server  
slack_bot: bundle exec ruby slack_bot.rb  
workers: bundle exec rake resque:workers QUEUE=* COUNT=*

2.5 现在可以通过工头一起使用了:

$ foreman start  

3 也可以导出工头到系统服务。

$ sudo foreman export --app app_name --user your_user_name systemd /etc/systemd/system/  

3.5 启动服务

$ systemctl start app_name.target

工头详细文档可用 here