2009-07-10 20 views
19

对于我的RubyOnRails-App,我必须在Capistrano部署结束时启动后台任务。对于这一点,我想在deploy.rb如下:用Capistrano开始后台任务

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

有时候这工作,但大部分没有启动该进程的时间(=不PS -aux列出)。并没有错误消息。没有nohup.out,不在主目录中,也不在rails应用程序目录中。

我试着在scheduler.rb中使用trap('SIGHUP','IGNORE')而不是nohup,但结果是一样的。

获得它的唯一方法是删除“:pty => true”,然后在“cap deploy”结束时执行手动Ctrl-C。但我不喜欢这...

是否有任何其他机会来调用此Scheduler.start?或者获得更多的错误信息?

我使用Rails 2.3.2,2.5.8 Capistrano的,Ubuntu的哈代的服务器上

+0

任何提示?仍然在重启后台作业...... – 2009-07-10 18:09:51

回答

1

你想对你的工作计划在后台连续运行,并获得重新启动时运行Capistrano的?

如果是这样,那么我用runit http://smarden.sunsite.dk/runit/和DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. 在不更换的init
  2. 的模式下安装runit添加您的后台作业的runit服务,并添加日志监控它从runit。
  3. 让Capistrano调用sudo sv kill job_name杀死并重新启动作业。

我的后台作业是处理后台Rails任务的Rails插件DelayedJob的一个实例。我在每次Capistrano部署时都会杀死它,因此它将以更新的代码库重新启动。

这已证明是非常可靠的。

HTH,

拉里

+0

是的,调度器应该在后台持续运行,并且应该在每次部署时重新启动。我在调度程序中使用DelayedJob - 还有一些自己的东西。 因为通过脚本/转轮启动有时与Capistrano一起工作(并且始终如果我通过SSH会话手动启动它)我认为Capistrano只有一个小问题 - 所以我不想让转移到runit,如果不是真的需要......但非常感谢你的帮助,拉里! – 2009-07-10 14:18:03

+0

重启后自动重启怎么办?这是runit处理的其他事情。 - 如果它死亡,则重新启动。问候。 – 2009-07-10 20:51:28

+0

@Georg:如果你喜欢Larry的回答,请upvote – 2009-07-24 23:40:50

14

随着:PTY =>真,用户壳启动脚本(例如bashrc中,等)(通常)未加载。我的ruby程序在启动后立即退出,因为缺少相关的环境变量。

没有:pty => true,正如您在问题中所描述的那样,capistrano挂在那里等待进程退出。您需要重定向stdout和stderr以使其立即返回。

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good. 

如果您的后台任务仍然无法运行。尝试将stdout和stderr重定向到日志文件,以便您可以调查输出。

1

如果此任务计划程序具有-d开关,则它将起作用。例如,独立旅客有一个-d选项可以将其作为恶魔化进程启动。

namespace :passenger_standalone do 
    task :start do 
    run "cd #{current_path} && passenger start -e #{rails_env} -d" 
    end 
    task :stop do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop" 
    end 
    task :restart do 
    stop 
    start 
    end 
end 
6

我想分享我的解决方案,它也适用于执行多个命令。我尝试了许多其他在线发现的变体,包括“睡眠N”黑客。

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true) 

这是一个DUP响应launching background process in capistrano task但要确保他人和自己可以谷歌这个解决方案。