【问题标题】:After upgrading Sidekiq to v6, it doesn't automatically start in production将 Sidekiq 升级到 v6 后,它不会在生产环境中自动启动
【发布时间】:2020-07-04 23:55:45
【问题描述】:

这是 Capistrano 的输出:

02:05 sidekiq:start
      01 sudo service sidekiq start index=1
      01 sidekiq (1) start/running, process 26392
    ✔ 01 deployer@IP 0.721s
      02 sudo service sidekiq start index=2
      02 sidekiq (2) start/running, process 26505
    ✔ 02 deployer@IP 0.728s

登录到服务器和ps aux | grep sidekiq 后,没有进程在运行。所以我回到我的本地终端选项卡并运行

cap staging sidekiq:start

新的 Sidekiq 进程会在服务器上显示几秒钟:

ps aux | grep sidekiq
deployer   489 52.0  1.0  76344 40856 ?        Rs   13:13   0:00 /home/deployer/.rvm/rubies/ruby-2.6.3/bin/ruby /home/deployer/.rvm/gems/ruby-2.6.3/bin/bundle exec sidekiq -i 1 -e staging
deployer   695  0.0  0.0  10472   936 pts/0    S+   13:13   0:00 grep --color=auto sidekiq
deployer 32744 42.2  1.4 111100 56188 ?        Rs   13:13   0:02 /home/deployer/apps/app-staging/shared/bundle/ruby/2.6.0/bin/sidekiq -i 2 -e staging

但几秒钟后,它就会消失。

如果我从服务器 RAILS_ENV=staging bundle exec sidekiq 运行 - Sidekiq 正在运行。但是第二次我重新启动服务器/部署新代码,Sidekiq 进程被杀死。

这是我在 Sidekiq 的 rake 任务:

namespace :sidekiq do
  desc "Tells Sidekiq (with signal TSTP) it will be shutting down at some point in the near future."\
  " It will stop accepting new work but continue working on current messages"
  task :quiet do
    on roles(:app) do
      puts capture("pgrep -f 'sidekiq' | xargs kill -TSTP")
    end
  end

  desc "Signals that Sidekiq should shut down within the -t timeout option given at start-up (see config/sidekiq.yml)."\
  " It will stop accepting new work, but continue working on current messages (as with USR1)."\
  " Any workers that do not finish within the timeout are forcefully terminated"\
  " and their messages are pushed back to Redis to be executed again when Sidekiq starts up. "
  task :terminate_gracefully do
    on roles(:app) do
      puts capture("pgrep -f 'sidekiq' | xargs kill -TERM")
    end
  end


  desc "Starts sidekiq workers. Fails if there are already running processes."
  task :start do
    on roles(:app) do
      pids =  capture("pgrep -f 'sidekiq'; true")
      puts "Present sidekiq process pids #{pids}"
      if pids.split("\n").count == 1
        # For each worker service with index ID is called
        execute "sudo service sidekiq start index=1"
        execute "sudo service sidekiq start index=2"
      else
        puts "##------------------------------------------------------------------##"
        puts "Sidekiq was not terminated before start execution. Wait untils it is finished and start it again (or kill the processes)."
        puts "##------------------------------------------------------------------##"
      end
    end
  end

  task :restart do
    invoke "sidekiq:terminate_gracefully"
    invoke "sidekiq:start"
  end
end

为什么 Capistrano 没有自动启动 Sidekiq v6?

【问题讨论】:

    标签: ruby-on-rails ruby ubuntu capistrano sidekiq


    【解决方案1】:

    Sidekiq 6.0 不再依赖守护进程,请参阅重大更改: https://github.com/mperham/sidekiq/blob/master/Changes.md#60

    BREAKING CHANGE 删除守护进程、日志文件和 pidfile Sidekiq 的论据。使用适当的进程主管(例如 systemd 或 工头)管理 Sidekiq。请参阅部署 wiki 页面以获取指向 更多资源。

    查看此主题如何使用 sidekiq 6.0 正确设置 systemd: https://github.com/seuros/capistrano-sidekiq/issues/224

    或官方维基: https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process

    【讨论】:

      【解决方案2】:

      在 6.0 sidekiq removed daemonization support 中,许多初始化脚本和 capistrano 示例都使用了它。这样做是为了促使人们使用适当的流程管理器,例如 systemd,它提供了许多稳定性和可管理性的好处。

      您应该相应地修改您的部署(实际上,许多项目并没有注意到这种变化,因为旧版本也更好地以这种方式运行)。请参阅 official wiki 了解如何设置部署。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 2012-08-06
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多