我的 Rails 应用程序中有一些宝石,例如resque
, sunspot
. 当机器启动时,我手动运行以下命令:
rake sunspot:solr:start
/usr/local/bin/redis-server /usr/local/etc/redis.conf
rake resque:work QUEUE='*'
在后台运行这些守护程序是否有更好的做法?在后台运行这些任务时是否有任何副作用?
我的 Rails 应用程序中有一些宝石,例如resque
, sunspot
. 当机器启动时,我手动运行以下命令:
rake sunspot:solr:start
/usr/local/bin/redis-server /usr/local/etc/redis.conf
rake resque:work QUEUE='*'
在后台运行这些守护程序是否有更好的做法?在后台运行这些任务时是否有任何副作用?
我的解决方案是混合使用上帝、capistrano 和任何时候。我遇到的一个具体问题是我希望所有应用程序进程都以用户身份运行,因此 initd 脚本不是一个选项(可以这样做,但用户切换/环境加载相当痛苦)。
基本思想是使用god来启动/重启/监控进程。上帝可能很难上手,但非常强大:
您仍然必须在服务器重新启动时启动上帝。这样做的一个好方法是使用用户 crontab。大多数 cron 实现都有一个名为的特殊指令@reboot
,它允许您在服务器重新启动时运行特定命令:
@reboot /bin/bash -l -c 'cd /home/my_app && SERVER=true god -c production/current/config/app.god"
无论何时是一个允许对 crontab 进行轻松管理的 gem,包括生成重新启动命令。虽然实现我所描述的并不是绝对必要的,但它对于其 capistrano 集成确实很有用。
您不仅要在服务器重新启动时启动进程,还希望在部署时重新启动它们。如果您的后台作业代码不是最新的,就会出现问题。
Capistrano可以轻松处理,只需god restart production
在部署后的 capistrano 任务中请求上帝重新启动整个组(如 : ),它将无缝处理。
When 的 capistrano 集成还确保您的 crontab 始终是最新的,如果您更改了config/schedule.rb
文件,则会对其进行更新。
您可以使用类似的东西foreman
来管理这些流程。您可以在 a 中定义流程类型和其他内容,Procfile
并且可以开始并使用它们做任何事情。