2012-08-27 168 views
24

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

关闭进程窗口并重新打开一个新窗口不会终止进程,因为它看起来像一个守护进程运行。

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

+0

杀 'PROCESS_ID' 工作得很好,杀死进程。虽然然后重新启动sidekiq它找不到redis。 – user1627827

+0

此外,'kill-term pid'会使它在接下来的10秒内优雅地关闭。 –

回答

16

只是一直在寻找到这一个我自己...

好像Sidekiq较新版本的这个建于:

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

杀-USR1 [PROCESS_ID]

对我很好。工作人员停止接受新工作,但完成了他们的工作,然后在完成后终于完成了这一过程。

杀-TERM [PROCESS_ID]

1

尝试使用神监视sidekiq。

然后,所有你需要做的是捆绑高管神停止

或者,你可以使用: sidekiqctl停止60

+0

'sidekiqctl stop '依赖于PID(进程ID) –

30

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

  1. 使用ps -ef | grep sidekiq找到PID
  2. 创建一个文件(例如,sidekiq.pid),唯一的内容是将PID你刚刚发现
  3. sidekiqctl stop <pidfile_name>
  4. 使用-P <pidfile_name>--pidfile <pidfile_name>在未来开始sidekiq时
58

用这个强行杀死sidekiq。

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

如果使用'ps -ef | grep sidekiq | grep -v grep | awk'{print $ 2}'| xargs杀死-TERM's sidekiq将给予时间暂停工人。 'sidekiqctl stop'命令是[抽象](https://github.com/mperham/sidekiq/blob/master/bin/sidekiqctl#L70) – Francisco

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/
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静态变量,这样你就不需要每次指定路径。希望这可以帮助!