Comme vous pouvez le voir sur l'image ci-jointe, j'ai quelques travailleurs qui semblent être bloqués. Ces processus ne devraient pas prendre plus de deux secondes.
Je ne sais pas pourquoi ils ne vont pas effacer ou comment les supprimer manuellement.
Je suis sur Heroku en utilisant Resque avec Redis-to-Go et HireFire pour adapter automatiquement les travailleurs.
Aucune de ces solutions ne fonctionnait pour moi, je verrais toujours cela dans le redis-web:
0 out of 10 Workers Working
Enfin, cela a fonctionné pour moi pour effacer tous les travailleurs:
Resque.workers.each {|w| w.unregister_worker}
Dans votre console:
queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"
Sinon, vous pouvez essayer de les simuler comme étant en train de les supprimer, avec:
Resque::Worker.working.each {|w| w.done_working}
EDIT
Beaucoup de gens ont voté en faveur de cette réponse et j'estime qu'il est important d'essayer la solution de hagope qui désenregistre les travailleurs d'une file d'attente, alors que le code ci-dessus supprime les files d'attente. Si vous êtes content de les simuler, alors cool.
Vous avez probablement le resque gem installé, vous pouvez donc ouvrir la console et obtenir les travailleurs actuels
Resque.workers
Il retourne une liste de travailleurs
#=> [#<Worker infusion.local:40194-0:Java_DYNAMIC_QUEUES,index_migrator,converter,extractor>]
choisissez le travailleur et Prune_dead_workers
, par exemple le premier
Resque.workers.first.Prune_dead_workers
Ajoutant à répondre par hagope, je voulais être en mesure de ne pas enregistrer les travailleurs qui avaient fonctionné pendant un certain temps. Le code ci-dessous ne désinscrira que les travailleurs en cours d'exécution pendant plus de 300 secondes (5 minutes).
Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}
J'ai une collection en cours de tâches liées à Rake liées à Resque auxquelles j'ai également ajouté ceci: https://Gist.github.com/ewherrmann/880935
Exécutez cette commande partout où vous avez exécuté la commande pour démarrer le serveur.
$ ps -e -o pid,command | grep [r]esque
vous devriez voir quelque chose comme ça:
92102 resque: Processing ProcessNumbers since 1253142769
Notez le PID (id de processus) dans mon exemple, il s’agit de 92102
Ensuite, vous pouvez quitter le processus de 1 à 2 manières.
Utiliser gracieusement QUIT 92102
Utiliser avec force TERM 92102
* Je ne suis pas sûr de la syntaxe, c'est soit QUIT 92102
ou QUIT -92102
Faites-moi savoir si vous avez des problèmes.
Je viens de faire:
% Rails c production
irb(main):001:0>Resque.workers
J'ai la liste des ouvriers.
irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)
... où n est l'index de base zéro du travailleur indésirable.
J'ai rencontré ce problème et commencé à mettre en œuvre un grand nombre des suggestions présentées ici. Cependant, j'ai découvert que la cause principale de ce problème était que j'étais en utilisant la gem redis-rb 3.3. . Le déclassement en redis-rb 3.2.2 a empêché ces travailleurs de rester bloqués au départ.
J'ai eu un problème similaire: Redis a sauvegardé la base de données sur un disque incluant des travailleurs non valides (non exécutés). Chaque fois que Redis/resque a été démarré, ils sont apparus.
Corrigez ceci en utilisant:
Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers
Assurez-vous de redémarrer Redis et vos employés Resque.
Voici comment vous pouvez les purger de Redis par nom d’hôte. Cela m’arrive lorsque je mets un serveur hors service et que les travailleurs ne sortent pas normalement.
Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }
J'ai commencé à travailler sur https://github.com/shaiguitar/resque_stuck_queue/ récemment. Ce n'est pas une solution pour résoudre le problème des travailleurs bloqués, mais cela résout le problème de la suspension du blocage/du blocage, alors j'ai pensé que cela pourrait être utile aux personnes sur ce sujet. De README:
"Si resque n'exécute pas les travaux dans un délai déterminé, un gestionnaire prédéfini de votre choix sera déclenché. Vous pouvez l'utiliser pour envoyer un courrier électronique, un devoir de pageur, ajouter davantage de travailleurs de resque, redémarrer resque, vous envoyer un txt. ..qui vous convient. "
A été utilisé dans la production et fonctionne assez bien pour moi jusqu'à présent.
Je les ai éliminés directement de redis-cli. Heureusement, redistogo.com autorise l'accès depuis des environnements extérieurs à heroku. Obtenez l'ID de travailleur mort de la liste. Le mien était
55ba6f3b-9287-4f81-987a-4e8ae7f51210:2
Exécutez cette commande directement dans redis.
del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"
Vous pouvez surveiller redis db pour voir ce qu’il fait en coulisse.
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 deuxième dernière ligne supprime le travailleur.
Cela évite le problème tant que vous avez une version de resque plus récente que la 1.26.0:
resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work
Gardez à l'esprit que cela ne laisse pas le travail en cours se terminer.
Si vous utilisez des versions plus récentes de Resque, vous devez utiliser la commande suivante car les API internes ont changé ...
Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}
vous pouvez également utiliser la commande ci-dessous pour arrêter tous les rescue
worker
Sudo kill -9 `ps aux | grep resque | grep -v grep | cut -c 10-16`
J'avais aussi des travailleurs bloqués/obsolètes ici, ou devrais-je dire "emplois", parce que le travailleur est toujours là et fonctionne bien, c'est le processus à la fourchette qui est bloqué.
J'ai choisi la solution brutale consistant à supprimer le processus "Traitement" en différé depuis plus de 5 minutes, via un script bash, puis le travailleur génère le suivant dans la file d'attente et tout continue.
regardez mon script ici: https://Gist.github.com/jobwat/5712437