Help us understand the problem. What is going on with this article?

sidekiq を安全に止める

More than 1 year has passed since last update.

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

1. TSTP で kill

# >= 5.0.0
kill -TSTP [worker_pid]

# < 5.0.0
kill -USR1 [worker_pid]

まず deploy する前に TSTP(v5.0.0 未満は 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 開始時に TSTP が送られ、完了時に再起動します。

参照

pekepek
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away