Supprimer toutes les files d'attente de RabbitMQ?


189

J'ai installé rabbitmqadminet j'ai pu lister tous les échanges et files d'attente. Comment puis-je utiliser rabbitmqadminou rabbitmqctlsupprimer toutes les files d'attente.

Réponses:


271

Tout d'abord, listez vos files d'attente:

rabbitmqadmin list queues name

Ensuite, dans la liste, vous devrez les supprimer manuellement un par un:

rabbitmqadmin delete queue name='queuename'

En raison du format de sortie, n'apparaît pas, vous pouvez grep la réponse à partir de list queues. Sinon, si vous cherchez simplement un moyen de tout effacer (lire: réinitialiser tous les paramètres , ramener l'installation à un état par défaut), utilisez:

rabbitmqctl stop_app
rabbitmqctl reset    # Be sure you really want to do this!
rabbitmqctl start_app

4
pour voir toutes les tâches en attente dans rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
Sachez que "rabbitmqctl reset" réinitialisera tout aux "paramètres d'usine". Tous les utilisateurs, hôtes virtuels, etc. de RabbitMQ que vous avez créés seront époustouflés.
thoufek

Excuses @ smartnut007, j'ai clarifié la deuxième partie de la réponse avec un avertissement.
lukiffer

25
attrapant juste les files d'attente vides. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan Cela supprimera toutes les files d'attente avec un 0 dans le nom ou le nombre. Pourrait vouloir faire grep $'\t0'ou quelque chose.
woot le

51

Avec rabbitmqadminvous pouvez les supprimer avec ce one-liner:

rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done

Dans mon cas, les files d'attente sont préfixées avec un mot-clé que je peux simplement utiliser egrep, donc ma commande ressemblera à ceci:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Logans

49

En fait, très facile avec le plugin de gestion et les politiques:

  • Accéder à la console de gestion (localhost: 15672)

  • Aller à l' onglet Admin

  • Onglet Aller aux politiques (sur le côté droit)

  • Ajouter une politique

  • Remplir les champs

    • Hôte virtuel: sélectionnez
    • Nom: expirer toutes les politiques (supprimer plus tard)
    • Motif:. *
    • Appliquer à: Files d'attente
    • Définition: expire avec la valeur 1 (changer le type de chaîne en nombre)
  • sauver

  • Onglet Checkout Files à nouveau
  • Toutes les files d'attente doivent être supprimées
  • Et n'oubliez pas de supprimer la politique !!!!!! .

1
sélectionnez "Nombre" dans Définition. Ne fonctionne pas avec la valeur par défaut ("String")
Mathias

Excellente réponse, en fait ma journée. Si vous sélectionnez "Echanges et files d'attente" dans la liste, vous pouvez facilement supprimer à la fois les files d'attente et les échanges. Je souhaite que ce pourrait être la réponse acceptée.
Wiktor Zychla

Solution très propre, sans avoir besoin de jouer autour de l'instance SSH.
acidburn23

Dommage que personne n'explique comment installer le plugin de gestion et les politiques
gelonida

@MesutA. Merci beaucoup. Je pense que c'est bien d'avoir ce lien dans cet article. Il vaudrait peut-être mieux l'ajouter à la réponse, car les commentaires pourraient être supprimés. Mais j'ai maintenant au moins cette info
gelonida

19

Essaye ça:

 rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn

2
Cela a fonctionné pour moi, mais a également montré *** Not found: /api/queues/%2F/nameparce que la sortie est une table ASCII avec une colonne "nom". J'ai modifié la commande pour y rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qnremédier.
Mark Edington

rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
Scott Leonard

9

Si rabbitmqadmin n'est pas installé, essayez de purger les files d'attente avec rabbitmqctl:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue


Il n'y a delete_queuepas de purge_queuecommandes ni dans rabbitmqctl. Je voudrais purger un grand nombre de files d'attente qui semblent être générées automatiquement et je ne voudrais pas installer un logiciel supplémentaire comme rabbitmqadmin...
Rolice

rabbitmqctl purge_queuetravaillé ici manuellement. Il me suffisait d'ajouter -p <hôte- virtuel>
Roman Susi

Contrairement à ce que @Rolice indiqué ci - dessus, à la fois delete_queueet purge_queuesont disponibles dans rabbitmqctlet je viens de les exécuter avec succès. Peut-être que vous utilisez une ancienne version.
Richard Dunn

C'est bien d'entendre cela, ceux-ci auraient pu être ajoutés récemment.
Rolice

7

Si vous essayez de supprimer des files d'attente parce qu'elles sont inutilisées et que vous ne voulez pas réinitialiser, une option consiste à définir le TTL de la file d'attente très bas via une stratégie, attendez que les files d'attente soient supprimées automatiquement une fois le TTL passé puis supprimez la stratégie ( https://www.rabbitmq.com/ttl.html ).

rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues

Pour supprimer la politique

rabbitmqctl clear_policy delq

Notez que cela ne fonctionne que pour utilisé files d'attente

Informations originales ici: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html


6

J'ai fait un deleteRabbitMqQs.sh, qui accepte les arguments pour rechercher la liste des files d'attente, en ne sélectionnant que celles qui correspondent au modèle souhaité. Si vous ne proposez aucun argument, il les supprimera tous! Il vous montre la liste des files d'attente qu'il est sur le point de supprimer, vous permettant de quitter avant de faire quoi que ce soit de destructeur.

for word in "$@"
do
        args=true
        newQueues=$(rabbitmqctl list_queues name | grep "$word")
        queues="$queues
$newQueues"
done
if [ $# -eq 0 ]; then
        queues=$(rabbitmqctl list_queues name | grep -v "\.\.\.")
fi

queues=$(echo "$queues" | sed '/^[[:space:]]*$/d')

if [ "x$queues" == "x" ]; then
        echo "No queues to delete, giving up."
        exit 0
fi

read -p "Deleting the following queues:
${queues}
[CTRL+C quit | ENTER proceed]
"

while read -r line; do
        rabbitmqadmin delete queue name="$line"
done <<< "$queues"

Si vous voulez une correspondance différente avec les arguments que vous passez, vous pouvez modifier le grep à la ligne quatre. Lors de la suppression de toutes les files d'attente, il ne supprimera pas celles avec trois espaces consécutifs, car j'ai pensé que cette éventualité serait plus rare que les personnes qui ont rabbitmqctl imprimant sa sortie dans différentes langues.

Prendre plaisir!


6

Dans la version 3.7.10 de Rabbit, vous pouvez exécuter la commande ci-dessous avec l'autorisation root:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue

5

Voici un moyen de le faire avec PowerShell. l'URL doit peut-être être mise à jour

$cred = Get-Credential
 iwr -ContentType 'application/json' -Method Get -Credential $cred   'http://localhost:15672/api/queues' | % { 
    ConvertFrom-Json  $_.Content } | % { $_ } | ? { $_.messages -gt 0} | % {
    iwr  -method DELETE -Credential $cred  -uri  $("http://localhost:15672/api/queues/{0}/{1}" -f  [System.Web.HttpUtility]::UrlEncode($_.vhost),  $_.name)
 }

Notez que cela ne supprime que les files d'attente non vides. Supprimez la clause -gt pour supprimer toutes les files d'attente
Peter Goodman

4

Vous pouvez utiliser rabbitmqctl eval comme ci-dessous:

rabbitmqctl eval 'IfUnused = false, IfEmpty = true, MatchRegex = 
<<"^prefix-">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <- 
rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex) 
=/= nomatch ].' 

Ce qui précède supprimera toutes les files d'attente vides dans tous les vhosts dont le nom commence par "prefix-". Vous pouvez modifier les variables IfUnused, IfEmpty et MatchRegex selon vos besoins.


Parfait pour quand rabbitmqadminn'est pas accessible.
NuSkooler

J'ai trouvé cela beaucoup plus rapide que list_queues
TerrenceSun

3

Suppression de toutes les files d'attente à l'aide de rabbitmqctl one liner

rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue

2

Dans le cas où vous souhaitez purger uniquement les files d'attente qui ne sont pas vides (beaucoup plus rapidement):

rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue

Pour moi, il faut 2-3 secondes pour purger une file d'attente (vides et non vides), donc parcourir 50 files d'attente est tellement pénible alors que j'ai juste besoin d'en purger 10 (40/50 sont vides).


2

J'ai essayé rabbitmqctl et réinitialiser les commandes mais elles sont très lentes.

C'est le moyen le plus rapide que j'ai trouvé (remplacez votre nom d'utilisateur et votre mot de passe):

#!/bin/bash

# Stop on error
set -eo pipefail

USER='guest'
PASSWORD='guest'

curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/@
# To also delete exchanges uncomment next line
# curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/@

Remarque: cela ne fonctionne qu'avec le vhost /


2

Pour lister les files d'attente,

./rabbitmqadmin -f tsv -q list queues

Pour supprimer une file d'attente,

./rabbitmqadmin delete queue name=name_of_queue

1

Voici une version plus rapide (utilisant parallelinstall sudo apt-get install parallel) développant l'excellente réponse de @admenva

parallel -j 50 rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -q delete queue name={} ::: $(rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -f tsv -q list queues name)


1

Cette commande supprime toutes vos files d'attente

python rabbitmqadmin.py \
  -H YOURHOST -u guest -p guest -f bash list queues | \
xargs -n1 | \
xargs -I{} \
  python rabbitmqadmin.py -H YOURHOST -u guest -p guest delete queue name={}

Ce script est super simple car il utilise -f bash, qui génère les files d'attente sous forme de liste.

Ensuite, nous utilisons xargs -n1pour diviser cela en plusieurs variables

Ensuite, nous utilisons xargs -I{}qui exécutera la commande suivante et la remplacera {}dans la commande.


J'ai essayé 10 réponses différentes, et c'est la SEULE chose qui a réellement fonctionné pour supprimer les files d'attente sans tuer tous mes autres paramètres. Merci! Je n'arrive pas à croire que rabbitmqctl ne dispose pas seulement d'une commande "drop all queues".
sudo

BTW, pour obtenir rabbitmqadmin, vous devez aller sur http://yourhost:15672/cli/et le télécharger.
sudo

1

Vous n'avez pas besoin de réinitialiser le serveur rabbitmq pour supprimer les files d'attente non durables . Arrêtez simplement le serveur et redémarrez et il supprimera toutes les files d'attente non durables disponibles.


y compris les files d'attente durables? Je ne pense pas. Je nuancerai votre réponse.
Hendy Irawan

Non, les files d'attente durables ne peuvent pas être supprimées en arrêtant le serveur. Ils peuvent être supprimés de l'interface Web de RabbitMQ Management sous les files d'attente.
ErAcube

En fait, oui, cela m'a aidé et toutes les 4500 files d'attente générées automatiquement ont disparu. Il semble que ceux-ci ne soient pas durables. Merci!
Rolice

1

Pour ceux qui ont un problème avec l'installation de rabbitmqadmin, vous devez d'abord installer python.

Les utilisateurs de systèmes d'exploitation de type UNIX doivent copier rabbitmqadmin dans un répertoire de PATH, par exemple / usr / local / bin.

Les utilisateurs Windows devront s'assurer que Python est sur leur PATH et appeler rabbitmqadmin en tant que python.exe rabbitmqadmin.

ensuite

  1. Naviguer vers http://{hostname}:15672/cli/rabbitmqadmin pour télécharger.
  2. Accédez au dossier contenant puis exécutez cmd avec le privilège d'administrateur

Pour répertorier les files d'attente python rabbitmqadmin list queues .

Pour supprimer la file d'attente python rabbitmqadmin delete queue name=Name_of_queue

Pour supprimer toutes les files d'attente

1- Déclarer la politique

python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues

2- Supprimer la politique

python rabbitmqadmin  delete policy name='expire_all_policies'

0

Il existe un moyen de supprimer toutes les files d'attente et tous les échanges sans scripts ni réinitialisation complète. Vous pouvez simplement supprimer et recréer un hôte virtuel à partir de l'interface d'administration. Cela fonctionnera même pour vhost/ .

La seule chose que vous aurez besoin de restaurer est les autorisations pour le vhost nouvellement créé.


0

D'accord, qualificatif important pour cette réponse: la question demande d'utiliser rabbitmqctl OU rabbitmqadmin pour résoudre cela, ma réponse devait utiliser les deux. Notez également que cela a été testé sur MacOS 10.12.6 et les versions du rabbitmqctl et rabbitmqadmin qui sont installés lors de l' installation rabbitmq avec Homebrew et qui est identifié avec brew list --versionscomme rabbitmq 3.7.0

rabbitmqctl list_queues -p <VIRTUAL_HOSTNAME> name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost <VIRTUAL_HOSTNAME> delete queue name=qname


0

Une autre option consiste à supprimer l'hôte virtuel associé aux files d'attente. Cela supprimera tout ce qui est associé au vhost, alors soyez prévenu, mais c'est facile et rapide.


REMARQUE: l'équipe RabbitMQ surveille la rabbitmq-usersliste de diffusion et ne répond que parfois aux questions sur StackOverflow.


0

J'ai essayé les morceaux de code ci-dessus mais je n'ai fait aucun streaming.

sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done.

Je génère un fichier qui contient tous les noms de files d'attente et les parcourt ligne par ligne pour les supprimer. Pour les boucles, while read ...je ne l'ai pas fait pour moi. Il s'arrêtait toujours au premier nom de file d'attente.


-1
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname

1
Je reçois ceci lors de son exécution: head: nombre de lignes illégal - -1
Robert Ross

Le "head -n-1" devrait être "head -1" ou "head -n 1"
Gerd Busker
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.