使用EventMachine定期计时器进行Capistrano远程执行

时间:2012-08-21 14:58:44

标签: ruby timer capistrano eventmachine

我正在使用ruby撒播gem(使用Capistrano作为其部署机制)来执行命令以在远程Ubuntu服务器上启动简单的ruby应用程序。下面是ruby应用程序代码的一小部分,我认为这个问题可能存在。

...
require 'eventmachine'
...
fork { run }

def run
    EM.run{
        Signal.trap('INT') { @log.debug("trapped INT signal"); stop(true) }
        Signal.trap('TERM'){ @log.debug("trapped TERM signal"); stop(true) }

        begin 

            pulsate
            @log.info "still ok here"
            EM.add_periodic_timer 60 do  # 1 minute
                @log.info "doesn't get here"                    
                pulsate
            end
            @log.info "doesn't get here"

        rescue => exc
            #never gets here    
            @log.error "Unable to add EM timer due to: #{exc}"
            exit -1
        end  
    }
end 

def pulsate...
def stop...
etc
...

奇怪的是,当我ssh到服务器并在那里运行它时,它都运行没有任何问题。但是当使用sprinkle / capistrano时,只要进程击中 EM.add_periodic_timer ,它就会消失。抛出没有异常,没有信号,没有日志输出,它似乎永远不会到达下一行?

另外,我正在使用最新版本的EventMachine gem:eventmachine(1.0.0.rc.4)和capistrano(2.12.0)(我认为它是一个红色的鲱鱼,因为它只是落在了capistrano上)< / p>

有关为何在远程执行期间失败但在服务器上执行时无法解决的任何想法?我可以尝试获取更多信息的任何想法吗?

1 个答案:

答案 0 :(得分:0)

在调用EM.run之前尝试设置全局EM错误处理程序。您可以在EM#error_handler查看文档,这可能会为您提供有关正在发生的事情的线索。