views:

342

answers:

1

For my RubyOnRails-App I have to start a background job at the end of Capistrano deployment. For this, I tried the following in deploy.rb:

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true

Sometimes this works, but most of the time it does not start the process (= not listed in ps -aux). And there are no error messages. And there is no nohup.out, not in the home directory and not in the rails app directory.

I tried using trap('SIGHUP', 'IGNORE') in scheduler.rb instead of nohup, but the result is the same.

The only way to get it work is removing the ":pty => true" and do a manual Ctrl-C at the end of "cap deploy". But I don't like this...

Are there any other chances to invoke this Scheduler.start? Or to get some more error messages?

I'm using Rails 2.3.2, Capistrano 2.5.8, Ubuntu Hardy on the Server

+1  A: 

Do you want your Scheduler job to run continually in the background and get restarted when you run Capistrano?

If so, then for that I use runit http://smarden.sunsite.dk/runit/ and DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. Install runit in the mode of not replacing init
  2. Add your background job as a runit service and add the log monitor for it from runit.
  3. Have Capistrano call sudo sv kill job_name to kill and restart the job.

My backround job is an instance of the Rails plugin DelayedJob which handles background Rails tasks. I kill it with every Capistrano deploy so it will restart with the updated code base.

This has proved to be very reliable.

HTH,

Larry

Larry K
Yes, the scheduler should run continually in the background and should be restartet on every deploy. Im using DelayedJob in the scheduler - and some own stuff.Because starting via script/runner works sometimes with Capistrano (and always if I start it manually via a SSH session) I think there is only a small problem with Capistrano - and so I don't want to make the move to runit, if it's not really needed... But thank you very much for for anwer, Larry!
Georg Ledermann
What about auto-restart upon reboot? That's something else that runit takes care of. -- Plus restarts if it ever dies. Regards.
Larry K
@Georg: If you like Larry's answer, please upvote
Adam Byrtek