我经常遇到由于用户错误(忘记关闭某些进程)导致一些额外的消费者正在监听已知 RabbitMQ 队列的情况。当我这样做时,rabbitmqctl list_consumers | grep <queue-name>
我可以看到消费者太多(通常是应有数量的两倍),但相关用户通常不知道这些消费者在哪里运行。有没有办法从列表消费者输出到正在运行相关进程的远程主机?我尝试了所有 list_* 子命令,但没有任何效果。
感谢您的任何想法。
答案1
在管理界面找到方向后(感谢@jrhodin),我能够弄清楚如何通过 rabbitmqctl 执行此操作。关键是将 pid 和 name 参数传递给list channels
。
首先,执行 list_consumers 并获取消费者 pid:
$ sudo rabbitmqctl list_consumers | grep <queue-name>
复制 pid(例如,<[电子邮件保护]>)
然后执行 list_channels 并查找 pid:
$ sudo rabbitmqctl list_channels pid connection name | grep '<your-pid-here>'
输出将显示远程和本地主机作为通道名称的一部分。如果您还想查找连接,可以获取连接 pid(来自上述命令)并通过 list_connections 查找它。
这是一个循环,它将输出给定队列的消费者和通道名称:
for i in $(sudo rabbitmqctl list_consumers | grep <queue-name> | cut -f 2);
do echo -n "Consumer: " $i;
echo -n " Channel: ";
sudo rabbitmqctl list_channels pid name | grep $i | cut -f 2;
done
示例输出:
Consumer: <[email protected]> Channel: xx.x.xx.159:8247 -> xxx.xx.xx.119:5671 (1)
Consumer: <[email protected]> Channel: xx.x.xx.159:9002 -> xxx.xx.xx.119:5671 (1)
Consumer: <[email protected]> Channel: xx.x.xx.159:7298 -> xxx.xx.xx.119:5671 (1)
Consumer: <[email protected]> Channel: xx.x.xx.159:12113 -> xxx.xx.xx.119:5671 (1)
Consumer: <[email protected]> Channel: xx.x.xx.159:14212 -> xxx.xx.xx.119:5671 (1)