ワーカーに変更を加えた場合、変更を有効にするためには 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 が送られ、完了時に再起動します。