web-dev-qa-db-ja.com

sidekiqプロセスを正常にシャットダウンする

Sidekiqのpidfileを見つけて正常にシャットダウンする方法を知っている人はいますか?ランニング ps ax | grep sidekiqを実行してからsidekiqctl stop <pid from grep>は常にno such pidfileエラー? Cntl-CとCntl-Dも効果がないようです。

プロセスウィンドウを閉じて新しいウィンドウを再度開いても、デーモンとして実行されているように見えるため、プロセスは強制終了されません。

私が見つけた唯一の一貫した修正は再起動です。

26
user1627827

これを使用してsidekiqを強制終了します。

ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9
63

Sidekiqは、開始時にpidfileを指定する機能、または以下に示すように、プロセスの開始後にpidfileを作成する機能を提供します。どちらの場合も、停止時にpidfileを使用できます。

  1. 使用する ps -ef | grep sidekiq pidを見つける
  2. ファイルを作成します(例:sidekiq.pid)唯一の内容は、あなたが見つけたばかりのpidです。
  3. sidekiqctl stop <pidfile_name>
  4. 使用する -P <pidfile_name>または--pidfile <pidfile_name>将来sidekiqを開始するとき
33
eebbesen

ちょうどこれを自分で調べていました...

Sidekiqの新しいバージョンにはこれが組み込まれているようです:

https://github.com/mperham/sidekiq/wiki/Signals

kill -USR1 [PROCESS_ID]

私にとってはうまくいきました。労働者は新しい仕事を拾うのをやめましたが、彼らが働いていた仕事を終えました、そしてそれが終わったときに私は最終的にプロセスを殺しました。

kill -TERM [PROCESS_ID]

18
dazoakley

Sidekiqを開始または停止できる小さなハンドラーを作成しました。

start_stop_sidekiq.sh

#!/bin/bash
cmd=$1
PROJECT_DIR=$2
PIDFILE=$PROJECT_DIR/tmp/pids/sidekiq.pid
cd $PROJECT_DIR

start_function(){
  LOGFILE=$PROJECT_DIR/log/sidekiq.log
  echo "Starting sidekiq..."
  bundle exec sidekiq -d -L $LOGFILE -P $PIDFILE -q mailer,5 -q default -e production
}

stop_function(){
  if [ ! -f $PIDFILE ]; then
    ps -ef | grep sidekiq | grep busy | grep -v grep | awk '{print $2}'  > $PIDFILE
  fi
  bundle exec sidekiqctl stop $PIDFILE
}

case "$cmd" in
  start)
    start_function
    ;;
  stop)
    stop_function
    ;;
  restart)
    stop_function && start_function;
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart} /path/to/Rails/app"
esac

保存して、「chmod +x start_stop_sidekiq.sh」と入力します。次に、それを実行します:

bash start_stop_sidekiq.sh start /path/to/your/Rails/app

または

bash start_stop_sidekiq.sh stop /path/to/your/Rails/app

Railsアプリが1つしかない場合は、$ PROJECT_DIR変数を静的に設定して、毎回パスを指定する必要がないようにすることもできます。これがお役に立てば幸いです!

4
DaniG2k

茂みが好きなら...

scripts/stop_sidekiq.sh

#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"

PROJECT_DIR=$DIR/../ # EDIT HERE: rel path to your project form this file location (my scripts are in ./scripts/)
SIDEKIQ_PID_FILE=$PROJECT_DIR/tmp/pids/sidekiq.pid  # EDIT HERE: pid file location

if [ ! -f $SIDEKIQ_PID_FILE ]; then
    # if no pid file, retrieve pid and create file
    ps -ef | grep sidekiq | grep busy | grep -v grep | awk '{print $2}'  > $SIDEKIQ_PID_FILE
fi

(cd $PROJECT_DIR && bundle exec sidekiqctl stop $SIDEKIQ_PID_FILE)

ノート:

  • pidファイル引数なしでsidekiqが起動した場合でも機能します
  • このスクリプトはプロジェクト内のフォルダーにあり、pidファイルは./tmp/pids/に格納されていると想定しています
2
laffuste

Godを使用してsidekiqを監視してみてください。

次に、実行する必要があるのは、exec god stopをバンドルすることだけです。

または、次を使用することもできます。sidekiqctl stop 60

1
Henley Chiu

Sidekiqが実行されているかどうかをチェックし、TSTPを送信して新しいジョブを取得しないように要求するbashスクリプトを共有し、実行中のジョブが完了するまで待機してから、TERMシグナルを送信してプロセスを停止します。

https://Gist.github.com/kamilbednarz/5ea6398af2a7537aa8feb5a63f3acf2f

0
Kamil Bednarz