2012-08-27 34 views
24

¿Alguien sabe cómo encontrar el archivo pid de sidekiq para cerrarlo con elegancia? Ejecutando ps ax | grep sidekiq y ejecutando sidekiqctl stop <pid from grep>, ¿se produce un error no such pidfile constantemente? Cntl-C y Cntl-D también parecen no tener ningún efecto.Cerrando con agrado los procesos de sidekiq

Cerrar la ventana de proceso y volver a abrir una nueva ventana no mata el proceso, ya que parece estar ejecutándose como daemon.

La única solución consistente que he encontrado es reiniciar.

+0

matar 'id_proceso' funcionó bien, para matar el proceso. Aunque luego reiniciar sidekiq no puede encontrar redis. – user1627827

+0

Además, 'kill -term pid' hará que se cierre con tanta gracia como sea posible en los próximos 10 segundos. –

Respuesta

16

Sólo estado buscando en este mismo ...

parece que las nuevas versiones de este Sidekiq han construido en:

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

matanza -USR1 [PROCESS_ID]

Funcionó muy bien para mí. Los trabajadores dejaron de buscar nuevos trabajos, pero terminaron con los que estaban, y finalmente maté el proceso cuando lo terminé.

matanza -TERM [PROCESS_ID]

1

Trate de usar dios para controlar sidekiq.

Entonces todo lo que tiene que hacer es dejar de dios ejecutivo paquete

Como alternativa, puede utilizar: sidekiqctl tope 60

+0

'sidekiqctl stop ' depende del pid (identificación del proceso) –

30

Sidekiq ofrece la posibilidad de especificar un archivo pid en la hora de inicio o, como se muestra a continuación, para crear el archivo pid después de que el proceso haya comenzado. En cualquier caso, puede utilizar el archivo pid en tiempo de parada.

  1. Uso ps -ef | grep sidekiq para encontrar el PID
  2. Crear un archivo (por ejemplo, sidekiq.pid) con los únicos contenidos siendo el pid que acaba de encontrar
  3. sidekiqctl stop <pidfile_name>
  4. Uso -P <pidfile_name> o --pidfile <pidfile_name> al iniciar sidekiq en el futuro
58

Utilice esto para matar sidekiq con fuerza.

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

Si se usa 'ps -ef | grep sidekiq | grep -v grep | awk '{print $ 2}' | xargs kill -TERM' sidekiq dará tiempo para pausar a los trabajadores. El comando 'sidekiqctl stop' es [una abstracción] (https://github.com/mperham/sidekiq/blob/master/bin/sidekiqctl#L70) – Francisco

2

Si te gusta ese tipo de fiestas ...

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) 

Notas:

  • funcionará incluso si sidekiq comenzó sin argumento de archivo pid
  • asume esto script está en una carpeta dentro del proyecto y los archivos pid se almacenan en./ tmp/pids/
4

He escrito un pequeño controlador que puede iniciar o detener 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 

guardarlo, tipo chmod +x start_stop_sidekiq.sh. A continuación, sólo ejecutarlo con:

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

o

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

Si sólo tiene una aplicación Rails, también se puede establecer la variable $ project_dir estáticamente de manera que no es necesario para especificar la ruta cada vez. ¡Espero que esto ayude!

Cuestiones relacionadas