sidekiq を安全に止める

  • 49
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ワーカーに変更を加えた場合、変更を有効にするためには sidekiq を再起動する必要があります。しかし、sidekiq は一度起動すると働き続けるため、いきなり止めるのは危険です。手順を踏んで再起動しましょう。

1. USR1 で kill

kill -USR1 [worker_pid]

まず deploy する前に USR1 で kill します。これで sidekiq は新しいプロセスを生成しなくなります。プロセスを見てみると下記のように stopping と書かれ、徐々にスレッド数が減っていくのがわかると思います。0 になると全てのスレッドが処理を完了したことがわかります。
しかし、特に処理の完了は待たずに deploy を開始します。

sidekiq 3.3.1 app_name [9 of 25 busy] stopping

2. TERM で kill

kill -TERM [worker_pid]

USR1 で kill しただけではプロセスが立ち上がらなくなるだけなので、deploy が完了したら sidekiq を停止させます。プロセスを確認すると sidekiq のプロセスがなくなったことがわかります。以上で安全に停止することができます。

sidekiqctl

kill コマンドを使わなくても、ターミナルから sidekiqctl を使って sidekiq を停止することができます。

# start of deploy
# quiet sends USR1
sidekiqctl quiet [pidfile]
# ... deploy happens ...
# stop sends TERM with a hard deadline to kill -9
sidekiqctl stop [pidfile] [deadline_timeout]

USR1 での kill は sidekiqctl quiet [pidfile]、TERM は sidekiqctl stop [pidfile] [deadline_timeout] が対応しています。
deadline_timeout は 60 秒で、60 秒待っても停止しない場合は kill -9 で強制終了します。

Capistrano

Capistrano を使って deploy している人は、capistrano-sidekiq を使うことでこれらの動作を自動化できます。
これで自動に deploy 開始時に USR1 が送られ、完了時に再起動します。

参照