sidekiq-cron で動かしていた定期実行ジョブを停止しようと際に詰まったので備忘録。
背景
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.on(:startup) do
schedule_file = "config/schedule.yml"
if File.exist?(schedule_file)
schedule = YAML.load_file(schedule_file)
Sidekiq::Cron::Job.load_from_hash!(schedule, source: "schedule")
end
end
end
config/schedule.yml
test_hello_world:
cron: "*/1 * * * * " # 1分ごとに実行
class: "HelloWorldWorker"
queue: "schedule"
description: "1分に1回 Hello World! を出力します。"
config/schedule.yml
- test_hello_world:
- cron: "*/1 * * * * " # 1分ごとに実行
- class: "HelloWorldWorker"
- queue: "schedule"
- description: "1分に1回 Hello World! を出力します。"
上記のように、もともと設定されていたスケジュールを削除しても定期実行処理が停止しないという現象に遭遇。
Sidekiq::Cron::Job.find("test_hello_world")
=> #<Sidekiq::Cron::Job:xxxxxxxxxxxxxxxxxx
@active_job=false,
@active_job_queue_name_delimiter="",
@active_job_queue_name_prefix="",
@args=[],
@cron="*/1 * * * * ",
@date_as_argument=false,
@description="1分に1回 Hello World! を出力します。",
@errors=[],
@fetch_missing_args=true,
@klass="HelloWorldWorker",
@last_enqueue_time=nil,
@message="{\"queue\":\"schedule\",\"class\":\"HelloWorldWorker\",\"args\":[]}",
@name="test_hello_world",
@parsed_cron=#<Fugit::Cron:xxxxxxxxxxxxxxxxxx @cron_s=nil, @day_and=nil, @hours=nil, @minutes=nil, @monthdays=nil, @months=nil, @original="*/1 * * * * ", @seconds=[0], @timezone=nil, @weekdays=nil, @zone=nil>,
@queue="schedule",
@queue_name_with_prefix="schedule",
@source="dynamic",
@status="enabled",
@symbolize_args=false>
↑ Sidekiq を再起動してもまだ残っている
原因および解決方法
# destroy all jobs
Sidekiq::Cron::Job.destroy_all!
# destroy job by its name
Sidekiq::Cron::Job.destroy "Job Name"
# destroy found job
Sidekiq::Cron::Job.find('Job name').destroy
上記の通り、Job を destroy
しないとダメだったらしい。(schedule ファイルから削除するだけでは不十分?)
Sidekiq::Cron::Job.find("test_hello_world").destroy
2024-05-17T08:01:05.754Z pid=243 tid=5tb INFO: Cron Jobs - deleted job with name: test_hello_world
=> 99
Sidekiq::Cron::Job.find("test_hello_world")
=> nil
↑無事消えた。
GUI で操作したい場合、下記のようなルーティングを設定することで Sidekiq ダッシュボード(/sidekiq
)内に「cron」タブが現れるので、そちらから無効化/削除も可能。
require "sidekiq/web"
require "sidekiq/cron/web"
Rails.application.routes.draw do
mount Sidekiq::Web, at: "/sidekiq"
end