用capistrano开始sidekiq

sag*_*kar 5 ruby capistrano ruby-on-rails-3 sidekiq

我想用capistrano开始sidekiq.下面是代码

namespace :sidekiq do
  task :start do
    run "cd #{current_path} && bundle exec sidekiq -c 10 -e production -L log/sidekiq.log &"
    p capture("ps aux | grep sidekiq | awk '{print $2}' | sed -n 1p").strip!    
  end
end
Run Code Online (Sandbox Code Playgroud)

它成功执行但仍未在服务器上启动sidekiq.

输出:

$ cap sidekiq:start
    triggering load callbacks
  * 2014-06-03 15:03:01 executing `sidekiq:start'
  * executing "cd /home/project/current && bundle exec sidekiq -c 10 -e production -L log/sidekiq.log &"
    servers: ["x.x.x.x"]
    [x.x.x.x] executing command
    command finished in 1229ms
  * executing "ps aux | grep sidekiq | awk '{print $2}' | sed -n 1p"
    servers: ["x.x.x.x"]
    [x.x.x.x] executing command
    command finished in 1229ms
"19291"
Run Code Online (Sandbox Code Playgroud)

Bro*_*tse 8

你的问题在于:

  cd /home/project/current && bundle exec sidekiq -c 10 -e production -L log/sidekiq.log &
Run Code Online (Sandbox Code Playgroud)

当您&在结束时添加命令时,将在单独的进程中执行,但此进程仍然是当前进程的子进程,并在当前进程停止时终止.相反,你需要运行sidekiq作为deamon.

bundle exec sidekiq -c 10 -e production -L log/sidekiq.log -d
Run Code Online (Sandbox Code Playgroud)

请注意额外-d选项


Viv*_*thi 5

在不使用任何宝石的情况下,这是我的解决方案与Capistrano 3.4.0完美配合的方法

namespace :sidekiq do

  task :restart do
    invoke 'sidekiq:stop'
    invoke 'sidekiq:start'
  end

  before 'deploy:finished', 'sidekiq:restart'

  task :stop do
    on roles(:app) do
      within current_path do
        pid = p capture "ps aux | grep sidekiq | awk '{print $2}' | sed -n 1p"
        execute("kill -9 #{pid}")
      end
    end
  end

  task :start do
    on roles(:app) do
      within current_path do
        execute :bundle, "exec sidekiq -e #{fetch(:stage)} -C config/sidekiq.yml -d"
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)