当我启动Rails服务器时自动运行Faye服务器

17

我目前已经将Faye集成到我的Rails 3.0.9应用程序中。但是我需要在终端开两个不同的标签页,一个用于Faye服务器,另一个用于Rails服务器。如何将它们集成,并在Rails启动时自动运行Faye服务器?

要启动Faye服务器,我正在运行:

rackup faye.ru -s thin -E production

faye.ru

require 'faye'
faye_server = Faye::RackAdapter.new(:mount => '/faye')
run faye_server

如果您需要更多信息,请告诉我。


只是提供信息:http://groups.google.com/group/faye-users/browse_thread/thread/52024c43bb26f04a - apneadiving
那最后一条消息是在说这不可能吗? - ardavis
不,我没有安装Faye,但我创建了一个初始化程序并放置了system("ruby #{Rails.root}/test_script.rb")。这个方法非常有效。尝试创建一个初始化程序,使用system("rackup faye.ru -s thin -E production") - apneadiving
看起来可以工作。请将其添加为答案,我会标记它。谢谢你的帮助,我的朋友。 - ardavis
很高兴知道它有所帮助。不客气,伙计 ;) - apneadiving
4个回答

13

1
您真是太棒了。非常感谢您。您并没有义务,但您可能会对我与此相关的另一个问题感兴趣。链接:http://stackoverflow.com/questions/6440852/checking-if-the-faye-server-exists-before-running-it-for-my-rails-app - ardavis
事后看来,需要另一个线程是显而易见的,否则主程序在启动命令后无法继续。 - apneadiving

7

现在,我只是使用Foreman来实现这一点: https://github.com/ddollar/foreman

通过创建一个Procfile,您可以指定需要运行哪些守护进程(并控制每个守护进程的数量),并将所有内容保留在一个终端窗口中(每个进程具有良好的颜色编码)。如果您的环境基于 Debian,则甚至可以导出到 upstart 或 init.d 脚本以供生产使用。

一旦您的 Procfile 都设置好了,那么您所需要做的就是运行:foreman start,然后就可以启动了。我用它来处理 resque 和 faye。


3
在Ubuntu上,您应该使用操作系统的init系统 - Upstart。
user@host:~$ cat /etc/init/faye.conf 
description "Faye Upstart script"

start on startup
stop on shutdown

respawn

script
    env RAILS_ENV=production

    exec sudo -u deployuser -i /home/deployuser/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/bin/rackup /var/www/booko.com.au/booko/faye.ru -s thin -E production
end script 

我不喜欢调用Ruby的方法,因为它会发生变化。但优点是它可以在系统启动时启动,并且如果它停止或被杀死,它会重新启动。

让Upstart负责使一个进程成为守护进程并确保它持续运行。


这似乎很吸引人,但不幸的是返回了“start: Unknown job: faye”。 我可以独立地在exec中启动该行。 - Stpn
@Stpn 尝试使用我之前推荐的Foreman。它可以导出为upstart脚本,这样更容易维护。 - xentek

3
我在config/thin_example.sh中编写了这个shell脚本。
#!/bin/sh

set -e

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/deployer/apps/example/current
PID=$APP_ROOT/tmp/pids/thin.pid
CMD="cd $APP_ROOT; bundle exec rackup -D -P $PID $APP_ROOT/config/faye.ru -s thin -E     production"
AS_USER=deployer
set -u

startme() {
    run "$CMD"
}

stopme() {
    run "pkill -f $PID"
}

run () {
  if [ "$(id -un)" = "$AS_USER" ]; then
    eval $1
  else
    su -c "$1" - $AS_USER
  fi
}

case "$1" in
    start)   startme ;;
    stop)    stopme ;;    
    restart) stopme; startme ;;
    *) echo "usage: $0 start|stop|restart" >&2
       exit 1
       ;;
esac

这段内容是从Ryan Bates在他的VPS deployment railscast (pro only)中使用的独角兽脚本中松散修改而来。

让它可执行

chmod +x config/thin_example.sh

您需要将其符号链接到init.d(在使用chmod + x将其设置为可执行文件后)

sudo ln -nfs /home/deployer/apps/example/current/config/thin_example.sh /etc/init.d/thin_example

如果你希望它随着服务器启动

 sudo update-rc.d thin_example defaults

否则,您应该只需执行/etc/init.d/thin_example [start|stop|restart]即可。需要注意的重要一点是,我告诉rackup以守护进程模式(-D)启动,并明确设置PID,以便稍后可以终止它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接