19

对于我的 RubyOnRails-App,我必须在 Capistrano 部署结束时启动后台作业。为此,我在 deploy.rb 中尝试了以下操作:

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

有时这可行,但大多数时候它不会启动进程(= 未在 ps -aux 中列出)。并且没有错误消息。并且没有 nohup.out,不在主目录中,也不在 rails app 目录中。

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

让它工作的唯一方法是删除 ":pty => true" 并在 "cap deploy" 结束时手动执行 Ctrl-C。但是我不喜欢这个...

还有其他机会调用这个 Scheduler.start 吗?或者获取更多错误信息?

我在服务器上使用 Rails 2.3.2、Capistrano 2.5.8、Ubuntu Hardy

4

4 回答 4

17

使用 :pty => true 时,(通常)不会加载用户 shell 启动脚本(例如 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 重定向到日志文件,以便您可以调查输出。

于 2011-04-29T07:19:30.897 回答
6

我想分享我的解决方案,它在执行多个命令时也有效。我尝试了许多其他在网上找到的变体,包括“sleep N”hack。

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)

这是在 capistrano 任务中启动后台进程的 dup 响应,但希望确保其他人和我自己可以通过谷歌搜索此解决方案。

于 2016-01-05T22:28:32.987 回答
1

您是否希望您的调度程序作业在后台持续运行并在您运行 Capistrano 时重新启动?

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

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

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

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

高温下,

拉里

于 2009-07-10T13:48:44.473 回答
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
于 2012-02-27T19:53:57.257 回答