我正在使用sidekiq部署rails应用程序。在每次部署时,Capistrano停止以前运行的sidekiq版本(ruby进程),然后启动一个新版本。我用monit监视sidekiq pid文件。
问题:每次部署pid文件发生更改但monit检测到它已更改并重新启动该进程。在几天和多个版本的时间里,当我只想要一个时,我最终得到了多个sidekiq实例。
这是我对sidekiq的monit配置:
check process sidekiq_main with pidfile /srv/apps/orders/current/tmp/pids/sidekiq.pid
every 3 cycles
start program = "/bin/bash -c -l 'cd /srv/apps/orders/current ; nohup bundle exec sidekiq -e production -C /srv/apps/orders/current/config/sidekiq.yml -i 0 -P /srv/apps/orders/current/tmp/pids/sidekiq.pid >> /srv/apps/orders/current/log/sidekiq.log 2>&1 &'"
stop program = "/bin/bash -c -l 'cd /srv/apps/orders/current ; bundle exec sidekiqctl stop /srv/apps/orders/current/tmp/pids/sidekiq.pid 10'"
group sidekiq
有没有办法配置monit以允许更改pid文件并且只确保sidekiq实例正在运行?
答案 0 :(得分:4)
覆盖默认的capistrano任务,以确保通过monit重启sidekiq。
例如,您可以将其添加到deploy.rb
namespace :sidekiq do
desc "Restart sidekiq"
task :restart, :roles => :app, :on_no_matching_servers => :continue do
run "sudo /usr/bin/monit restart sidekiq"
end
end