优雅地关闭sidekiq进程

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

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

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

用这个强有力地杀死sidekiq。

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

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

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

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

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

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

kill -USR1 [PROCESS_ID]

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

kill -TERM [PROCESS_ID]

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

如果你喜欢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/中

尝试使用god监视sidekiq。

然后你需要做的就是捆绑exec神停

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

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

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