【问题标题】:Sidekiq launches and mysteriously disappears when started by Capistrano由 Capistrano 启动的 Sidekiq 启动并神秘消失
【发布时间】:2018-06-15 09:54:22
【问题描述】:

我正在努力使用自定义 v2 capistrano 任务远程启动 sidekiq:

namespace :sidekiq do
  desc "Start sidekiq"
  task :start do
    run "cd #{current_path} && bundle exec sidekiq --version"
    run "cd #{current_path} && bundle exec sidekiq --environment production --daemon --config config/sidekiq.yml && echo OK"
  end
end

输出:

  * 2018-01-05 11:40:51 executing `sidekiq:start'
  * executing "cd /home/deploy/applications/xxx/current && bundle exec sidekiq --version"
    servers: ["198.58.110.211"]
    [198.58.110.211] executing command
 ** [out :: 198.58.110.211] Sidekiq 5.0.5
 ** [out :: 198.58.110.211]
    command finished in 1424ms
  * executing "cd /home/deploy/applications/xxx/current && bundle exec sidekiq --environment production --daemon --config config/sidekiq.yml && echo OK"
    servers: ["198.58.110.211"]
    [198.58.110.211] executing command
 ** [out :: 198.58.110.211] OK
    command finished in 1128ms

我可以确认我正在获取环境(rbenv & bundler 正确),如第一次运行 cmd 所示。但出乎意料的是,sidekiq 任务开始并分散到遗忘中:1)tmp/pids/sidekiq.pid 被初始化但进程不存在,2)logs/sidekiq.log 被创建但仅带有标题:

# Logfile created on 2018-01-05 11:34:09 -0300 by logger.rb/56438
  • 如果我移除 --daemon 开关,我可以让进程完美运行,但当然 capistrano 部署任务永远不会结束,当我执行 CTRL+C 时 sidekiq 会关闭。

  • 如果我只是 ssh 进入远程并执行命令(显然替换 current_path),它会完美运行。

  • 我几乎尝试了所有我能想象到的东西:不使用 config.file,使用 RAILS_ENV 代替 --environment,等等。

  • 如“&& echo OK”所示,该命令未返回错误。

  • Capistrano 正在使用 "/bin/bash --login -c 'cd /home/deploy/applications/microgestion/current && bundle exec sidekiq --environment production --daemon --config config/sidekiq.yml '" 据我所知运行命令。

  • Ruby v2.3.3、Capistrano 2.15.5、Sidekiq 5.0.5、Rails 4.0.12

【问题讨论】:

  • 您的Capfile 中有set :pty, true 吗? Here 是与它相关的一些问题。
  • @user3309314 是的,我设置了 default_run_options[:pty] = true。我想你已经搞定了,但问题是我很确定它的存在是因为某些事情。 . 没有变通办法?
  • 尝试使用capistrano-sidekiq gem。也许会有所帮助

标签: ruby-on-rails ruby capistrano sidekiq


【解决方案1】:

如果你使用普通的 Capistrano 来守护 Sidekiq,任何崩溃都会导致停机。不要这样做。您需要使用进程监视器,如果 Sidekiq 进程死亡,它将重新启动它。按照文档中的说明使用 systemd、upstart 和/或 Foreman。

https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process

【讨论】:

  • 当然,我使用 monit 来检查。但是部署时需要重启sidekiq进程来加载代码更新..
  • Systemd 和 upstart 是流程管理器。它们的存在是为了启动/停止关键服务。
【解决方案2】:

通过在末尾添加 && sleep 1 解决了这个问题,如下所述:http://blog.hartshorne.net/2013/03/capistrano-nohup-and-sleep.html

  desc "Start sidekiq"
  task :start do
    run "cd #{current_path} && bundle exec sidekiq --environment production --daemon --config config/sidekiq.yml && sleep 1"
  end

感谢@user3309314 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 2016-10-31
    • 2016-11-08
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多