优雅地关闭sidekiq进程

时间:2012-08-27 13:50:20

标签: ruby sidekiq

有谁知道如何找到sidekiq的pidfile来优雅地关闭它? 运行ps ax | grep sidekiq然后一直运行sidekiqctl stop <pid from grep>会出现no such pidfile错误? Cntl-C和Cntl-D似乎也没有效果。

关闭进程窗口并重新打开一个新窗口不会终止进程,因为它似乎作为守护进程运行。

我发现的唯一一致修复是重启。

7 个答案:

答案 0 :(得分:63)

用它来强行杀死sidekiq。

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

答案 1 :(得分:33)

Sidekiq提供了在开始时指定pid文件的功能,或者如下所示,在启动进程后创建pid文件。在任何一种情况下,您都可以在停止时使用pid文件。

  1. 使用ps -ef | grep sidekiq查找pid
  2. 创建一个文件(例如sidekiq.pid),其中唯一的内容是您刚刚找到的pid
  3. sidekiqctl stop <pidfile_name>
  4. 将来启动sidekiq时使用-P <pidfile_name>--pidfile <pidfile_name>

答案 2 :(得分:18)

我自己一直在研究这个......

似乎更新版本的Sidekiq内置了这个:

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

  

kill -USR1 [PROCESS_ID]

对我来说很棒。工人们不再接受新的工作,但完成了他们的工作,然后我终于在完成工作后终止了这个工作。

  

kill -TERM [PROCESS_ID]

答案 3 :(得分:4)

我写了一个可以启动或停止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应用程序,您还可以静态设置$ PROJECT_DIR变量,这样您就不需要每次都指定路径。希望这有帮助!

答案 4 :(得分:2)

如果你喜欢bashes ......

<强>脚本/ 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)

注意:

    即使sidekiq没有pid文件参数,
  • 也能正常工作
  • 假设此脚本位于项目内的文件夹中,并且pid文件存储在./tmp/pids/

答案 5 :(得分:1)

尝试使用god监视sidekiq。

然后您需要做的就是捆绑执行神停止

或者,您可以使用: sidekiqctl stop 60

答案 6 :(得分:0)

共享一个检查sidekiq是否正在运行的bash脚本,向它发送TSTP以要求它不接收任何新的作业,等待任何正在运行的任务完成,然后通过向其发送TERM信号来停止该过程。

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