railsでバックグラウンドの処理をする場合、resqueでもsidekiqでもrailsとは別にワーカーを立ち上げる必要がある。事前起動と落ちていたときの管理はわずらわしい。
管理は、capistranoタスク、最初に手動で、起動スクリプト、monitなどがありますが、
Railsソース内で完結した形(システムコマンドは使う)で起動するようにしたいと思います。
Open3.popen3(%Q! x=`ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`; [ "$x" == "" ] && cd #{Rails.root} && bundle exec sidekiq -d -C #{Rails.root}/config/sidekiq.yml -e #{Rails.env}!)
システムコマンドのOpen3.popen3で、sidekiqワーカーが起動しているかを確認して、起動していなければワーカーを立ち上げる仕組み。
うっかりワーカー立ち上げるの忘れちゃっても、キューを入れる前にこれを実行すれば防げる。
クラス化したのは以下。
require 'sidekiq/api'
class KiqStart
def self.start
if (!!Sidekiq.redis(&:info) rescue false)
Open3.popen3(%Q! x=`ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`; [ "$x" == "" ] && cd #{Rails.root} && bundle exec sidekiq -d -C #{Rails.root}/config/sidekiq.yml -e #{Rails.env}!) {|a,b,c| b.read }
end
end
def self.redis_run?
(!!Sidekiq.redis(&:info) rescue false)
end
def self.process_run?
Open3.popen3(%Q! echo `ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`;!) do |a,b,c| p b.read end.strip.present?
end
def self.stop
Open3.popen3(%Q! cd #{Rails.root} && bundle exec sidekiqctl stop tmp/pids/sidekiq.pid 0 !)
end
def self.status
p "-" * 10
p "redis run?"
p self.redis_run?
p "-" * 10
p "queue_size"
p Sidekiq::Queue.new.size
p "-" * 10
p "processes_size"
p Sidekiq::ProcessSet.new.size
p "-" * 10
end
end
システムコマンドを使っているため、気になる場合は変数をすべてスタティック文字列に置き換えるなど確認してご利用ください。