Here’s an output from 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
After logging to the server and ps aux | grep sidekiq
, there’s no process running. So I go back to my local terminal tab and run
cap staging sidekiq:start
and the new Sidekiq process shows up for a few seconds on the server:
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
But after a few seconds, it will disappear.
If I run from the server RAILS_ENV=staging bundle exec sidekiq
– Sidekiq is running. But the second I restart the server/deploy new code, the Sidekiq process gets killed.
Here are my rake tasks for 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
Why is Sidekiq v6 not being automatically started by Capistrano?
2
Answers
Sidekiq 6.0 no longer depend on daemonization, see breaking changes:
https://github.com/mperham/sidekiq/blob/master/Changes.md#60
Check out this topic how to properly setup systemd with sidekiq 6.0:
https://github.com/seuros/capistrano-sidekiq/issues/224
Or official wiki:
https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process
In 6.0 sidekiq removed daemonization support, which was used by many init script and capistrano examples out there. This was done to urge people into using proper process managers like systemd, which provide many stability and manageability benefits.
You should modify your deployment accordingly (actually, many projects did not notice this change because older versions also are better to run this way). See official wiki on how to setup deployment.