如何用supervisord正确管理rabbitmq

use*_*054 24 rabbitmq supervisord

我的supervisord.conf中的当前部分如下所示:

[program:rabbitmq] command =/usr/sbin/rabbitmq-server

当我试图用supervisord(supervisorctl stop rabbitmq)停止rabbitmq时,rabbitmq进程根本就没有关闭.rabbitmq文档还提到永远不要使用kill,而是使用rabbitmqctl stop.我猜测supervisord只会杀死进程 - 因此使用rabbitmq会导致糟糕的结果.我在supervisord中找不到任何选项来指定自定义停止命令.

你有什么建议?

Hui*_*eng 36

我的解决方案是编写一个名为rabbitmq.sh的包装脚本,如下所示:

# call "rabbitmqctl stop" when exiting
trap "{ echo Stopping rabbitmq; rabbitmqctl stop; exit 0; }" EXIT

echo Starting rabbitmq
rabbitmq-server
Run Code Online (Sandbox Code Playgroud)

之后,修改supervisord.conf:

[program:rabbitmq]
command=path/to/rabbitmq.sh 
Run Code Online (Sandbox Code Playgroud)

  • 这部分对我有用.我用我的最终解决方案创建了一个要点:https://gist.github.com/caioariede/342a583f75467509ad42 (3认同)

Mic*_*lon 3

你已经回答了你自己的问题。在正常操作中,切勿对任何进程使用kill,除非这是记录的正常管理方式。对于 RabbitMQ,记录的过程是使用rabbitmqctl stop 或使用rabbitmqserver stop。

没有充分的理由使用任何比 shell 脚本更复杂的东西来管理 RabbitMQ,该 shell 脚本会尝试通过rabbitmqserver start 重新启动。如果这不能立即起作用,那么 RabbitMQ 会由于 RAM 不足、磁盘空间不足或流氓系统管理工具删除了一些rabbitmq 二进制组件等原因而严重崩溃。

在正常操作中,RabbitMQ 有一个内部管理程序,它将尝试关闭并重新启动 RabbitMQ,因此如果删除二进制文件,它将无法重新启动。使用chef、puppet、cfengine等工具时,不要重复推送二进制包文件。只需检查一切是否都按其应有的方式存在即可。