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