将 Sidekiq 升级到 v6 后,它不会在生产中自动启动
After upgrading Sidekiq to v6, it doesn't automatically start in production
这是 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
,没有进程运行ning。所以我回到本地终端选项卡并 运行
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 是 运行ning。但是第二次我重新启动 server/deploy 新代码,Sidekiq 进程被杀死。
这是我在 Sidekiq 的佣金任务:
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?
Sidekiq 6.0 不再依赖守护进程,查看重大更改:
https://github.com/mperham/sidekiq/blob/master/Changes.md#60
BREAKING CHANGE Remove the daemonization, logfile and pidfile
arguments to Sidekiq. Use a proper process supervisor (e.g. systemd or
foreman) to manage Sidekiq. See the Deployment wiki page for links to
more resources.
查看此主题如何使用 sidekiq 6.0 正确设置 systemd:
https://github.com/seuros/capistrano-sidekiq/issues/224
或官方维基:
https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process
在 6.0 sidekiq removed daemonization support 中,许多 init 脚本和 capistrano 示例都使用了它。这样做是为了敦促人们使用适当的流程管理器,如 systemd,它提供了许多稳定性和可管理性优势。
您应该相应地修改您的部署(实际上,许多项目没有注意到此更改,因为旧版本也更适合 运行 这种方式)。请参阅 official wiki 了解如何设置部署。
这是 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
,没有进程运行ning。所以我回到本地终端选项卡并 运行
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 是 运行ning。但是第二次我重新启动 server/deploy 新代码,Sidekiq 进程被杀死。
这是我在 Sidekiq 的佣金任务:
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?
Sidekiq 6.0 不再依赖守护进程,查看重大更改: https://github.com/mperham/sidekiq/blob/master/Changes.md#60
BREAKING CHANGE Remove the daemonization, logfile and pidfile arguments to Sidekiq. Use a proper process supervisor (e.g. systemd or foreman) to manage Sidekiq. See the Deployment wiki page for links to more resources.
查看此主题如何使用 sidekiq 6.0 正确设置 systemd: https://github.com/seuros/capistrano-sidekiq/issues/224
或官方维基: https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process
在 6.0 sidekiq removed daemonization support 中,许多 init 脚本和 capistrano 示例都使用了它。这样做是为了敦促人们使用适当的流程管理器,如 systemd,它提供了许多稳定性和可管理性优势。
您应该相应地修改您的部署(实际上,许多项目没有注意到此更改,因为旧版本也更适合 运行 这种方式)。请参阅 official wiki 了解如何设置部署。