【发布时间】:2012-07-12 15:59:15
【问题描述】:
我安装了rabbitmqadmin 并且能够列出所有的交换和队列。如何使用rabbitmqadmin 或rabbitmqctl 删除所有队列。
【问题讨论】:
标签: rabbitmq rabbitmqctl
我安装了rabbitmqadmin 并且能够列出所有的交换和队列。如何使用rabbitmqadmin 或rabbitmqctl 删除所有队列。
【问题讨论】:
标签: rabbitmq rabbitmqctl
首先,列出你的队列:
rabbitmqadmin list queues name
然后从列表中,你需要手动将它们一一删除:
rabbitmqadmin delete queue name='queuename'
由于输出格式的原因,您可以 grep 来自list queues 的响应。或者,如果您只是想清除所有内容(阅读:重置所有设置,将安装恢复到默认状态),请使用:
rabbitmqctl stop_app
rabbitmqctl reset # Be sure you really want to do this!
rabbitmqctl start_app
【讨论】:
rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
grep $'\t0' 什么的。
使用management plugin 和策略实际上超级简单:
转到 管理控制台 (localhost:15672)
转到管理标签
转到政策标签(在右侧)
添加政策
填写字段
保存
再次结帐队列标签
必须删除所有队列
别忘了删除政策!!!!!!。
【讨论】:
使用rabbitmqadmin,您可以使用此单线删除它们:
rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
【讨论】:
egrep,所以我的命令将如下所示:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
试试这个:
rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
【讨论】:
*** Not found: /api/queues/%2F/name,因为输出是一个带有“名称”列的 ASCII 表。我将命令调整为 rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn 来修复它。
rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
在 Rabbit 3.7.10 版本中,您可以使用 root 权限运行以下命令:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue
【讨论】:
如果您没有安装 rabbitmqadmin,请尝试使用 rabbitmqctl 清除队列:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue
【讨论】:
rabbitmqctl 中没有 delete_queue 和 purge_queue 命令。我想清除很多似乎是自动生成的队列,我不想安装额外的软件,比如rabbitmqadmin...
rabbitmqctl purge_queue 在这里手动工作。我只需要添加 -p delete_queue 和purge_queue 都在rabbitmqctl 中可用,我刚刚成功运行它们。也许您使用的是旧版本。
如果您尝试删除队列,因为它们未使用并且您不想重置,一种选择是通过策略将队列 TTL 设置为非常低,等待队列自动删除TTL 已通过,然后删除策略 (https://www.rabbitmq.com/ttl.html)。
rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues
删除政策
rabbitmqctl clear_policy delq
请注意,这只适用于未使用队列
此处为原始信息:http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html
【讨论】:
我创建了一个 deleteRabbitMqQs.sh,它接受参数来搜索队列列表,只选择与您想要的模式匹配的那些。如果您不提供任何参数,它将全部删除!它会向您显示即将删除的队列列表,让您在执行任何破坏性操作之前退出。
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"
如果您希望对传入的参数进行不同的匹配,您可以更改第四行中的 grep。删除所有队列时,它不会删除其中包含三个连续空格的队列,因为我认为与使用 rabbitmqctl 以不同语言打印其输出的人相比,这种可能性会更少。
享受吧!
【讨论】:
这是一种使用 PowerShell 的方法。 URL 可能需要更新
$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)
}
【讨论】:
你可以使用 rabbitmqctl eval 如下:
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 ].'
以上将删除所有具有名称的虚拟主机中的所有空队列 以“前缀-”开头。 您可以编辑变量 IfUnused, IfEmpty, 和 MatchRegex 根据您的要求。
【讨论】:
rabbitmqadmin 时。
使用rabbitmqctl one liner删除所有队列
rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
【讨论】:
你不需要重置 rabbitmq 服务器来删除 non-durable 队列。只需停止服务器并重新启动,它就会删除所有可用的 non-durable 队列。
【讨论】:
如果您只想清除非空队列(更快):
rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
对我来说,清除一个队列(空的和非空的)需要 2-3 秒,所以遍历 50 个队列是一件很痛苦的事情,而我只需要清除其中的 10 个(40/50 是空的) )。
【讨论】:
我尝试了 rabbitmqctl 和 reset 命令,但它们非常慢。
这是我找到的最快的方法(替换您的用户名和密码):
#!/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/@
注意:这仅适用于默认 vhost /
【讨论】:
这是一个更快的版本(使用 parallel install sudo apt-get install parallel)扩展了 @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)
【讨论】:
这个命令会删除你所有的队列
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={}
这个脚本超级简单,因为它使用-f bash,将队列输出为一个列表。
然后我们使用xargs -n1 将其拆分为多个变量
然后我们使用xargs -I{} 将运行以下命令,并替换命令中的{}。
【讨论】:
http://yourhost:15672/cli/下载。
列出队列,
./rabbitmqadmin -f tsv -q list queues
要删除队列,
./rabbitmqadmin delete queue name=name_of_queue
【讨论】:
我尝试了上述代码,但没有进行任何流式传输。
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done。
我生成一个包含所有队列名称的文件,并逐行循环以删除它们。对于循环,while read ... 并没有为我做这件事。它总是停在第一个队列名称处。
【讨论】:
安装rabbitmqadmin有问题的请先安装python。
类 UNIX 操作系统用户需要将 rabbitmqadmin 复制到 PATH 中的一个目录,例如/usr/local/bin.
Windows 用户需要确保 Python 在他们的 PATH 上,并以 python.exe rabbitmqadmin 的形式调用 rabbitmqadmin。
然后
http://{hostname}:15672/cli/rabbitmqadmin 进行下载。 列出队列
python rabbitmqadmin list queues.
删除队列
python rabbitmqadmin delete queue name=Name_of_queue
删除所有队列
1- 声明政策
python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues
2- 删除策略
python rabbitmqadmin delete policy name='expire_all_policies'
【讨论】:
有一种方法可以在没有脚本和完全重置的情况下删除所有队列和交换。您可以从管理界面删除并重新创建虚拟主机。这甚至适用于 vhost /。
您唯一需要恢复的是新创建的虚拟主机的权限。
【讨论】:
好的,这个答案的重要限定符: 该问题确实要求使用 rabbitmqctl 或 rabbitmqadmin 来解决此问题,我的答案需要同时使用两者。另外,请注意,这是在 MacOS 10.12.6 和 rabbitmqctl 和 rabbitmqadmin 版本上测试的作为 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
【讨论】:
另一个选项是删除与队列关联的虚拟主机。这将删除与虚拟主机关联的所有内容,因此请注意,但它既简单又快速。
注意:RabbitMQ 团队监控 the rabbitmq-users mailing list,并且有时只回答 * 上的问题。
【讨论】:
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname
【讨论】: