代码之家  ›  专栏  ›  技术社区  ›  Georg Ledermann

使用Capistrano启动后台任务

  •  19
  • Georg Ledermann  · 技术社区  · 17 年前

    对于我的RubyonRails应用程序,我必须在Capistrano部署结束时开始一个后台工作。为此,我在deploy.rb中尝试了以下操作:

    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、capistrano2.5.8、ubuntu hardy

    4 回复  |  直到 17 年前
        1
  •  17
  •   Arrix    15 年前

    当:pty=>为true时,用户shell启动脚本(例如bashrc等)通常不会加载。由于缺乏相关的环境变量,我的Ruby程序刚推出后就退出了。

    没有:Pt= & Gt;是的,正如你在这个问题中所描述的,卡普斯特拉诺在那里等待着退出的过程。您需要重定向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重定向到日志文件,以便可以调查输出。

        2
  •  6
  •   Community Mohan Dere    9 年前

    我想分享我的解决方案,它也适用于执行多个命令。我尝试了网上找到的其他变种,包括“睡眠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 但我想确保其他人和我自己都能在谷歌上找到这个解决方案。

        3
  •  1
  •   Larry K    17 年前

    是否希望计划程序作业在后台连续运行,并在运行Capistrano时重新启动?

    如果是,那我就用runit http://smarden.sunsite.dk/runit/ 和延迟的工作 http://github.com/Shopify/delayed_job/tree/master

    1. 以不替换init的方式安装runit
    2. 将后台作业添加为runit服务,并从runit为其添加日志监视器。
    3. 让Capistrano调用sudo sv kill job_name来终止并重新启动作业。

    我的backround作业是rails插件delayedjob的一个实例,它处理后台rails任务。我每部署一个capistrano就杀了它,这样它就会用更新的代码库重新启动。

    事实证明,这是非常可靠的。

    HTH公司,

    拉里

        4
  •  1
  •   Pratik Khadloya    14 年前

    如果这个任务调度程序有一个-d开关,它将工作。例如,passenger standalone有一个-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