Comme vous pouvez le voir sur l'image ci-jointe, j'ai quelques ouvriers qui semblent bloqués. Ces processus ne devraient pas prendre plus de quelques secondes.
Je ne sais pas pourquoi ils ne s'effaceront pas ou comment les supprimer manuellement.
Je suis sur Heroku en utilisant Resque avec Redis-to-Go et HireFire pour mettre à l'échelle automatiquement les travailleurs.
ruby-on-rails
ruby-on-rails-3
heroku
redis
resque
Shpigford
la source
la source
Réponses:
Aucune de ces solutions n'a fonctionné pour moi, je verrais toujours ceci dans redis-web:
Enfin, cela a fonctionné pour moi pour effacer tous les travailleurs:
la source
heroku restart
semblait faire l'affaire. Il montre maintenant le nombre correct de travailleurs.Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
nœuds de calcul qui ne sont pas des processus réels (et peut-être des travaux de traitement), vous pouvez essayer de supprimer uniquement les nœuds de calcul dont les pids ne font pas partie des pids en cours d'exécution connus. Je ne sais pas si cela fonctionne dans tous les environnements mais cela fonctionne bien sur ubuntu. Cela peut ne fonctionner que lorsque vos travailleurs sont sur la même machine sur laquelle vous exécutez ce code.unregister_worker
? Y a-t-il un moyen de déterminer cela?Dans votre console:
Sinon, vous pouvez essayer de les simuler comme étant fait pour les supprimer, avec:
ÉDITER
Beaucoup de gens ont voté pour cette réponse et je pense qu'il est important que les gens essaient 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 heureux de les simuler, alors cool.
la source
Vous avez probablement installé le gem resque, vous pouvez donc ouvrir la console et obtenir les travailleurs actuels
Il renvoie une liste de travailleurs
choisissez le travailleur et
prune_dead_workers
, par exemple, le premierla source
Ajoutant à répondre par hagope, je voulais pouvoir désinscrire uniquement les travailleurs qui avaient fonctionné pendant un certain temps. Le code ci-dessous annulera uniquement les travailleurs exécutés pendant plus de 300 secondes (5 minutes).
J'ai une collection en cours de tâches de rake liées à Resque auxquelles j'ai également ajouté ceci: https://gist.github.com/ewherrmann/8809350
la source
Exécutez cette commande partout où vous avez exécuté la commande pour démarrer le serveur
vous devriez voir quelque chose comme ceci:
Notez le PID (identifiant de processus) dans mon exemple, il s'agit de 92102
Ensuite, vous pouvez quitter le processus de 1 à 2 façons.
Utilisez gracieusement
QUIT 92102
Utiliser avec force
TERM 92102
* Je ne suis pas sûr de la syntaxe c'est soit
QUIT 92102
ouQUIT -92102
Faites-moi savoir si vous rencontrez des problèmes.
la source
Je viens de faire:
J'ai la liste des travailleurs.
... où n est l'index de base zéro du travailleur indésirable.
la source
J'ai eu un problème similaire lorsque Redis a enregistré la base de données sur un disque contenant des travailleurs invalides (non en cours d'exécution). Chaque fois que Redis / resque a été lancé, ils sont apparus.
Corrigez cela en utilisant:
Assurez-vous de redémarrer Redis et vos nœuds de calcul Resque.
la source
Voici comment vous pouvez les purger de Redis par nom d'hôte. Cela m'arrive lorsque je désactive un serveur et que les travailleurs ne quittent pas correctement.
la source
J'ai rencontré ce problème et j'ai commencé à mettre en œuvre un grand nombre de suggestions ici. Cependant, j'ai découvert que la cause première de ce problème était que j'utilisais le gem redis-rb 3.3.0 . La rétrogradation vers redis-rb 3.2.2 a empêché ces travailleurs de rester bloqués en premier lieu.
la source
J'ai commencé à travailler sur https://github.com/shaiguitar/resque_stuck_queue/ récemment. Ce n'est pas une solution pour réparer les travailleurs bloqués, mais cela résout le problème du resque suspendu / bloqué, donc j'ai pensé que cela pourrait être utile pour les personnes sur ce fil. De README:
"Si resque n'exécute pas les travaux dans un certain laps de temps, il déclenchera un gestionnaire prédéfini de votre choix. Vous pouvez l'utiliser pour envoyer un e-mail, faire un téléavertisseur, ajouter plus de travailleurs de resque, redémarrer resque, vous envoyer un txt. .. tout ce qui vous convient. "
A été utilisé en production et fonctionne plutôt bien pour moi jusqu'à présent.
la source
J'avais des travailleurs de resque bloqués / périmés ici aussi, ou devrais-je dire `` emplois '', car le travailleur est toujours là et fonctionne bien, c'est le processus fourchu qui est bloqué.
J'ai choisi la solution brutale de tuer le processus fourchu "Processing" depuis plus de 5min, via un script bash, puis le worker vient de générer le suivant dans la file d'attente, et tout continue
jetez un œil à mon script ici: https://gist.github.com/jobwat/5712437
la source
Je les ai effacés directement de redis-cli. Heureusement, redistogo.com permet l'accès à partir d'environnements extérieurs à heroku. Obtenez l'ID de travailleur mort dans la liste. Le mien était
Exécutez cette commande directement dans Redis.
Vous pouvez surveiller redis db pour voir ce qu'il fait dans les coulisses.
La deuxième dernière ligne supprime le travailleur.
la source
Si vous utilisez des versions plus récentes de Resque, vous devrez utiliser la commande suivante car les API internes ont changé ...
la source
Cela évite le problème tant que vous avez une version de resque plus récente que 1.26.0:
Gardez à l'esprit qu'il ne laisse pas la tâche en cours d'exécution se terminer.
la source
vous pouvez également utiliser la commande ci-dessous pour arrêter tous les
rescue
travailleursréférence à partir de ce lien
la source