0

I am using the ruby sprinkle gem (using Capistrano as its deployment mechanism) to execute a command to start a simple ruby app on a remote Ubuntu server. Below is a small snippet of the ruby app code where I think the problem could lie.

...
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
...

The strange thing is that it all runs without any problems when I ssh on to the server and run it there. However when using sprinkle/capistrano, as soon as the process hits the EM.add_periodic_timer it just disappears. No exception is thrown, no signals, no log output, it just seems to never get to the next line?

Also, I am using the latest version of the EventMachine gem: eventmachine (1.0.0.rc.4) and capistrano (2.12.0) (sprinkle is a red herring I think as it just falls back on capistrano)

Any ideas of why it could fail during the remote execution but not when executed in place on the server? Any ideas of things I can try to get more information?

Vic
  • 53
  • 3

1 Answers1

0

Try setting the global EM error handler before calling EM.run. You can see the documentation at EM#error_handler which may give you a clue as to what's going on.

dj2
  • 9,534
  • 4
  • 29
  • 52
  • Thanks - I actually ended up taking a completely different approach - using cron as the scheduling mechanism as it turned out to be in line with other requirements that cropped up. – Vic May 27 '13 at 12:49