【问题标题】:Delayed job wont start using Capistrano延迟的工作不会开始使用 Capistrano
【发布时间】:2011-05-12 22:45:51
【问题描述】:

我无法使用 capistrano 配方启动延迟的作业流程。这是我得到的错误。

/usr/local/lib/ruby/gems/1.9.1/gems/delayed_job-2.1.1/lib/delayed/command.rb:62:in `mkdir': File exists - /my_app/server/releases/20101120001612/tmp/pids (Errno::EEXIST)

这是 capistrano 代码(注意:我已尝试过启动/重启命令)

after "deploy:restart", "delayed_job:start"
task :start, :roles => :app do          
  run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -n 2 start"
end

部署日志中的更多详细错误 -

executing command
 [err :: my_server] /usr/local/lib/ruby/gems/1.9.1/gems/delayed_job-2.1.1/lib/delayed/command.rb:62:in `mkdir': File exists - /my_app/server/releases/20101120001612/tmp/pids (Errno::EEXIST)
 [err :: my_server] from /usr/local/lib/ruby/gems/1.9.1/gems/delayed_job-2.1.1/lib/delayed/command.rb:62:in `daemonize'
 [err :: my_server] from script/delayed_job:5:in `<main>'
    command finished
failed: "sh -c 'cd /my_app/server/current; RAILS_ENV=production script/delayed_job -n 3 restart'" on myserevr

这是一个 Rails 3 应用程序 (v3.0.3)

【问题讨论】:

    标签: ruby-on-rails capistrano delayed-job


    【解决方案1】:

    看到同样的问题。

    原来我错过了~/apps/application_name/shared/pids 目录。

    最终创建它使这个问题消失了。

    无需设置自定义dj_pids目录。

    【讨论】:

      【解决方案2】:

      我也遇到了这个错误并发现了几个问题:

      • 确保您有一个shared/pids 文件夹。
      • 确保您有正确的挂钩设置

      您的 deploy.rb 脚本应包含:

      require "delayed/recipes"
      
      after "deploy:stop", "delayed_job:stop"
      after "deploy:start", "delayed_job:start"
      after "deploy:restart", "delayed_job:restart"
      

      我从旧帖子中复制了钩子,现在它们似乎不正确。这些来自实际的延迟作业配方文件 cmets。

      我相信cap deploy:setup 应该创建pids 文件夹,但我以不同的方式进行了设置,但它没有被创建。 app/current/tmp/pids 链接到 app/shared/pids,这导致了 false 目录存在错误。

      【讨论】:

      • 这里也一样。在使用 capistrano 鲜为人知的 shared_children 设置时发生。通过共享中的符号链接解决:ln -s tmp/pids.
      • 非常有帮助的答案解决了我的问题。非常感谢!
      • @Zubin、@wallerjake 和@PhilT:我想我有同样的符号链接问题:current/tmp/pids -&gt; /var/www/apps/production.myserver.de/shared/pids 所以我必须去/var/www/apps/production.myserver.de/shared-目录并输入ln -s tmp/pids-命令?我对 Unix 命令不是很熟悉 :( 谢谢!
      • 好的,我唯一要做的就是在/var/www/apps/production.myserver.de/shared 中创建pids-目录:)
      【解决方案3】:

      这就是我解决问题的方法,我使用“--pid-dir”传递了一个明确的 pids dir 参数。不确定这是否完美,但它确实有效。

      task :restart, :roles => :app do
        run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -n #{dj_proc_count} --pid-dir=#{app_root}/shared/dj_pids restart"
      end
      

      【讨论】:

        【解决方案4】:

        添加之前创建这个目录

        after "deploy:restart", "delayed_job:start"
        task :start, :roles => :app do  
          run "mkdir #{current_path}/tmp/pids"
          run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -n 2 start"
        end
        

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题。原来有一个存在的

          application_name/shared/pids/delayed_job.main.pid

          文件的所有者权限不正确,导致部署失败。修复此文件的权限为我解决了这个问题。

          【讨论】:

            【解决方案6】:

            由于创建目录既便宜又快速,请使用以下回调:

            before 'deploy', 'deploy:setup'
            

            这将确保结构在每次部署之前始终存在。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-16
              • 2013-07-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-04
              • 1970-01-01
              • 1970-01-01
              • 2011-05-14
              相关资源
              最近更新 更多