¿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.
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.
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}
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.
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
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
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 gracia
QUIT 92102
Usar con fuerza
TERM 92102
* no estoy seguro de la sintaxis es QUIT 92102
o QUIT -92102
Avísame si tienes alguno problema.
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.
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.
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) }
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.
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.
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
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.
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)}
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.
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`
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