27

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

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

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

4

7 回答 7

75

用它来强行杀死sidekiq。

ps -ef | grep sidekiq | grep -v grep | awk '{print $2}' | xargs kill -9
于 2014-02-14T21:46:11.900 回答
36

Sidekiq 提供了在启动时指定 pidfile 的能力,或者如下所示,在进程启动后创建 pidfile。无论哪种情况,您都可以在停止时使用 pidfile。

  1. 用于ps -ef | grep sidekiq查找 pid
  2. 创建一个文件(例如sidekiq.pid),其唯一内容是您刚刚找到的 pid
  3. sidekiqctl stop <pidfile_name>
  4. 以后启动 sidekiq 时使用-P <pidfile_name>or--pidfile <pidfile_name>
于 2013-08-15T20:16:25.190 回答
18

我自己也在研究这个...

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

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

杀死 -USR1 [PROCESS_ID]

对我来说效果很好。工人们停止接受新工作,但完成了他们正在从事的工作,然后我终于在完成后终止了该过程。

杀死 -TERM [PROCESS_ID]

于 2012-11-23T15:01:43.093 回答
5

我编写了一个可以启动或停止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 变量,这样您就不需要每次都指定路径。希望这可以帮助!

于 2015-01-28T21:44:20.260 回答
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/
于 2014-11-26T03:00:52.243 回答
2

尝试使用上帝来监控 sidekiq。

然后你需要做的就是 bundle exec god stop

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

于 2013-01-12T00:17:53.343 回答
0

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

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

于 2018-02-14T12:23:59.227 回答