¿Cómo puedo borrar los trabajadores de Resque atascados/obsoletos?


Como se puede ver en la imagen adjunta, tengo un par de trabajadores que parecen estar atascados. Esos procesos no deberían tardar más de un par de segundos.

introduzca la descripción de la imagen aquí

No estoy seguro de por qué no se borran o cómo eliminarlos manualmente.

Estoy en Heroku usando Resque con Redis-to-Go y HireFire para escalar automáticamente los trabajadores.

Author: Shpigford, 0000-00-00

15 answers

Ninguna de estas soluciones funcionó para mí, todavía vería esto en redis-web:

0 out of 10 Workers Working

Finalmente, esto funcionó para mí para limpiar a todos los trabajadores:

Resque.workers.each {|w| w.unregister_worker}
 208
Author: hagope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 21:51:25

En tu consola:

queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"

De lo contrario, puede tratar de fingir que se hace para eliminarlos, con:

Resque::Worker.working.each {|w| w.done_working}

EDITAR

Mucha gente ha votado a favor de esta respuesta y siento que es importante que la gente pruebe la solución de hagope que anula 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.

 48
Author: Simpleton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 08:16:16

Es probable que tenga instalada la gema resque, por lo que puede abrir la consola y obtener los trabajadores actuales

Resque.workers

Devuelve una lista de trabajadores

#=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]

Elige el trabajador y prune_dead_workers, por ejemplo el primero

Resque.workers.first.prune_dead_workers
 27
Author: Shairon Toledo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-22 12:41:29

Añadiendo a la respuesta de hagope, quería ser capaz de anular el registro de los trabajadores que habían estado funcionando durante una cierta cantidad de tiempo. El siguiente código solo anulará el registro de los trabajadores que se ejecuten durante más de 300 segundos (5 minutos).

Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}

Tengo una colección continua de tareas de Rake relacionadas con Resque a las que también he agregado esto: https://gist.github.com/ewherrmann/8809350

 24
Author: ewH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 18:29:06

Ejecute este comando donde quiera que ejecute el comando para iniciar el servidor

$ ps -e -o pid,command | grep [r]esque

Deberías ver algo como esto:

92102 resque: Processing ProcessNumbers since 1253142769

Tome nota del PID (id de proceso) en mi ejemplo es 92102

Entonces puede salir del proceso de 1 de 2 maneras.

  • Usar con graciaQUIT 92102

  • Usar con fuerza TERM 92102

* no estoy seguro de la sintaxis es QUIT 92102 o QUIT -92102

Avísame si tienes alguno problema.

 8
Author: jBeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-27 19:41:40

Acabo de hacerlo:

% rails c production
irb(main):001:0>Resque.workers

Tengo la lista de trabajadores.

irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)

... donde n es el índice basado en cero del trabajador no deseado.

 6
Author: user2811637,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 14:47:38

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 inició Redis/resque aparecieron.

Arregla esto usando:

Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers

Asegúrese de reiniciar Redis y Resque workers.

 2
Author: joost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-15 11:39:59

Así es como puedes purgarlos de Redis por nombre de host. Esto me sucede cuando desconecto un servidor y los trabajadores no salen con gracia.

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }
 2
Author: Rich Sutton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-08 01:49:13

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 impidió que estos trabajadores se quedaran atascados en primer lugar.

 2
Author: Will Bryant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 21:08:57

Comenzó a trabajar en https://github.com/shaiguitar/resque_stuck_queue/ recientemente. No es una solución a cómo arreglar los trabajadores atascados, pero aborda el problema de resque colgando/estar atascado, así que pensé que podría ser útil para las personas en este hilo. De README:

"Si resque no ejecuta trabajos dentro de un cierto período de tiempo, activará un controlador predefinido de su elección. Puede usar esto para enviar un correo electrónico, deber de buscapersonas, agregar más trabajadores de resque, reiniciar resque, enviarle un txt...lo que más te convenga."

Se ha utilizado en la producción y funciona bastante bien para mí hasta ahora.

 1
Author: Shai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 23:17:29

Yo había atascado/rancio resque trabajadores aquí también, o debería decir 'puestos de trabajo', porque el trabajador es en realidad todavía allí y funcionando bien, es el proceso bifurcado que está atascado.

Elegí la solución brutal de matar el proceso bifurcado "Processing" desde hace más de 5 minutos, a través de un script bash, luego el trabajador solo genera el siguiente en la cola, y todo sigue adelante

Echa un vistazo a mi script aquí: https://gist.github.com/jobwat/5712437

 0
Author: jobwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-06 05:55:01

Los he limpiado de redis-cli directamente. Por suerte redistogo.com permite el acceso desde entornos fuera de heroku. Consigue la identificación del trabajador muerto de la lista. El mío era

55ba6f3b-9287-4f81-987a-4e8ae7f51210:2

Ejecute este comando en redis directamente.

del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"

Puede monitorear redis db para ver lo que está haciendo detrás de escena.

redis xxx.redistogo.com> MONITOR
OK
1380274567.540613 "MONITOR"
1380274568.345198 "incrby" "resque:stat:processed" "1"
1380274568.346898 "incrby" "resque:stat:processed:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*" "1"
1380274568.346920 "del" "resque:worker:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*"
1380274568.348803 "smembers" "resque:queues"

La penúltima línea elimina el worker.

 0
Author: Andrei R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 09:50:26

Si está utilizando versiones más recientes de Resque, necesitará usar el siguiente comando ya que las API internas han cambiado...

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}
 0
Author: lloydpick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 16:48:20

Esto evita el problema siempre y cuando tenga una versión de resque más reciente que 1.26.0:

resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work

Tenga en cuenta que no permite que el trabajo en ejecución finalice.

 0
Author: Joakim Kolsjö,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-05 14:23:19

También puede usar el siguiente comando para detener todo rescue worker

sudo kill -9  `ps aux | grep resque | grep -v grep | cut -c 10-16`

Referencia de este enlace

 0
Author: uzaif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 11:16:02