Como puede ver en la imagen adjunta, tengo un par de trabajadores que parecen estar atascados. Esos procesos no deberían tomar más de un par de segundos.
No estoy seguro de por qué no se borrarán o cómo eliminarlos manualmente.
Estoy en Heroku usando Resque con Redis-to-Go y HireFire para escalar automáticamente a los trabajadores.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
fuente
fuente
Respuestas:
Ninguna de estas soluciones funcionó para mí, todavía vería esto en redis-web:
Finalmente, esto funcionó para mí para despejar a todos los trabajadores:
fuente
heroku restart
parecía hacer el truco. Ahora muestra el número correcto de trabajadores.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
cuál solo anulará el registro de aquellos trabajadores cuyos pids no forman parte de los pids en ejecución conocidos. No sé si esto funciona en todos los entornos, pero funciona bien en ubuntu. Esto solo puede funcionar cuando sus trabajadores están en la misma máquina en la que ejecuta este código.unregister_worker
? ¿Hay alguna manera de determinar esto?En tu consola:
De lo contrario, puede intentar simularlos para eliminarlos, con:
EDITAR
Mucha gente ha votado a favor de esta respuesta y creo que es importante que la gente pruebe la solución de hagope que elimina el registro de los trabajadores de una cola, mientras que el código anterior elimina las colas. Si estás feliz de fingirlos, entonces genial.
fuente
Probablemente tenga instalada la gema de resque, por lo que puede abrir la consola y obtener los trabajadores actuales
Devuelve una lista de trabajadores.
elegir al trabajador y
prune_dead_workers
, por ejemplo, el primerofuente
Agregando a la respuesta por hagope, quería poder cancelar el registro de los trabajadores que habían estado funcionando durante un cierto período de tiempo. El siguiente código solo anulará el registro de los trabajadores que se ejecutan durante más de 300 segundos (5 minutos).
Tengo una colección continua de tareas de Rake relacionadas con Resque a las que también he agregado esto en: https://gist.github.com/ewherrmann/8809350
fuente
Ejecute este comando donde sea que haya ejecutado el comando para iniciar el servidor
Debería ver algo como esto:
Tome nota del PID (id de proceso) en mi ejemplo, es 92102
Luego puede salir del proceso de 1 a 2 formas.
Usar con gracia
QUIT 92102
Usar con fuerza
TERM 92102
* No estoy seguro de la sintaxis que es
QUIT 92102
oQUIT -92102
Avísame si tienes algún problema.
fuente
Lo acabo de hacer:
Tengo la lista de trabajadores.
... donde n es el índice basado en cero del trabajador no deseado.
fuente
Tuve un problema similar que Redis guardó la base de datos en el disco que incluía trabajadores no válidos (no en ejecución). Cada vez que se iniciaba Redis / resque aparecían.
Solucione esto usando:
Asegúrese de reiniciar Redis y sus trabajadores de Resque.
fuente
Así es como puede purgarlos de Redis por nombre de host. Esto me sucede cuando desmantelo un servidor y los trabajadores no salen con gracia.
fuente
Me encontré con este problema y comencé a implementar muchas de las sugerencias aquí. Sin embargo, descubrí que la causa raíz que estaba creando este problema era que estaba usando la gema redis-rb 3.3.0 . La degradación a redis-rb 3.2.2 evitó que estos trabajadores se atascaran en primer lugar.
fuente
Comenzó a trabajar en https://github.com/shaiguitar/resque_stuck_queue/ recientemente. No es una solución sobre cómo reparar a los trabajadores atascados, pero aborda el problema del bloqueo / bloqueo de resque, por lo que pensé que podría ser útil para las personas en este hilo. De README:
"Si resque no ejecuta trabajos dentro de un período de tiempo determinado, activará un controlador predefinido de su elección. Puede usar esto para enviar un correo electrónico, buscar localizador, agregar más trabajadores de resque, reiniciar resque, enviarle un mensaje de texto. ..lo que te venga bien."
Se ha utilizado en producción y funciona bastante bien para mí hasta ahora.
fuente
Aquí también tuve trabajadores atascados / atrasados, o debería decir 'trabajos', porque el trabajador todavía está allí y funciona bien, es el proceso bifurcado el que está atascado.
Elegí la solución brutal de matar el proceso bifurcado "Procesando" desde hace más de 5 minutos, a través de un script bash, luego el trabajador genera el siguiente en la cola, y todo continúa
Echa un vistazo a mi script aquí: https://gist.github.com/jobwat/5712437
fuente
Los eliminé de redis-cli directamente. Afortunadamente, redistogo.com permite el acceso desde entornos externos a heroku. Obtenga la identificación del trabajador muerto de la lista. El mío era
Ejecute este comando en redis directamente.
Puede monitorear redis db para ver qué está haciendo detrás de escena.
La segunda última línea elimina al trabajador.
fuente
Si está utilizando versiones más nuevas de Resque, deberá usar el siguiente comando ya que las API internas han cambiado ...
fuente
Esto evita el problema siempre que tenga una versión de revisión más reciente que 1.26.0:
Tenga en cuenta que no permite que finalice el trabajo actualmente en ejecución.
fuente
También puede usar el siguiente comando para detener a todos los
rescue
trabajadoresreferencia desde este enlace
fuente