如何使用supervisord正确管理rabbitmq

如何使用supervisord正确管理rabbitmq,rabbitmq,supervisord,Rabbitmq,Supervisord,my supervisord.conf中的当前部分如下所示: [程序:rabbitmq] command=/usr/sbin/rabbitmq服务器 当我尝试使用supervisord(supervisorctl stop rabbitmq)停止rabbitmq时,rabbitmq进程不会关闭。rabbitmq文档还提到永远不要使用kill,而是使用rabbitmqctl stop。我猜supervisord只是杀死了进程——因此rabbitmq的结果很差。我在supervisord中找不到任何

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

[程序:rabbitmq] command=/usr/sbin/rabbitmq服务器

当我尝试使用supervisord(supervisorctl stop rabbitmq)停止rabbitmq时,rabbitmq进程不会关闭。rabbitmq文档还提到永远不要使用kill,而是使用rabbitmqctl stop。我猜supervisord只是杀死了进程——因此rabbitmq的结果很差。我在supervisord中找不到任何选项来指定自定义停止命令


你有什么建议吗?

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

没有什么比尝试通过rabbitmqserver start重新启动的shell脚本更复杂的东西来管理RabbitMQ了。如果这不能立即起作用,那么RabbitMQ将因RAM不足、磁盘空间不足或恶意系统管理工具删除了一些RabbitMQ二进制组件而严重停机


在正常操作中,RabbitMQ有一个内部管理器,它将尝试关闭并重新启动RabbitMQ,因此如果删除二进制文件,它将无法重新启动。当使用诸如chef、puppet、cfengine之类的工具时,不要重复推出二进制软件包文件。只需检查所有内容是否正常。

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

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

echo Starting rabbitmq
rabbitmq-server
之后,修改supervisord.conf:

[program:rabbitmq]
command=path/to/rabbitmq.sh 

我建议您使用Monit(),它更适合RabbitMQ这样的守护进程,而且功能丰富

首先,您必须安装Monit包。如果您使用的是Ubuntu/Debian:

sudo apt-get update
sudo apt-get install monit
之后,您必须创建一个配置脚本。 下面是一个让您运行的示例脚本(将其放在/etc/monit/conf.d/):

然后,只需重新启动monit,即可完成:

 sudo /etc/init.d/monit restart

此脚本将RabbitMQ作为后台进程启动(使用“&”),这将导致更新/创建pid文件(请参阅下面的“等待”)

启动rabbit后,将使用一个循环来验证pid是否仍在运行。如果rabbit崩溃或手动关闭(在supervisord之外),则脚本将以1退出,supervisord接管

echo>>./rmq.txt文件用于调试目的,可以在生产中注释掉(我使用它来监视启动/关闭/死亡状态)

supervisord很高兴,因为它可以看到一个正在运行的进程,退出将触发stop_rmq函数,该函数调用“rabbitmqctl stop”进行干净的关闭

#!/bin/bash

# Script to manage RMQ with supervisord

# Shut down rmq
function stop_rmq {

  echo "Stopping RabbitMQ..."
  echo "Stopping RabbitMQ..." >> ./rmq.txt
  rabbitmqctl stop
  echo "RabbitMQ stopped"
  echo "RabbitMQ stopped" >> ./rmq.txt
  #exit 0
}

# Set up the trap
#trap stop_rabbit TERM KILL HUP INT SIGTERM SIGKILL SIGHUP SIGINT
trap stop_rmq exit

# Start rmq
echo "Starting RabbitMQ..."
echo "Starting RabbitMQ..." >> ./rmq.txt
# Start Rabbitmq in the background (causes the pid file to be updated)
# Note that the pid file location can be overridden with the rmq 'RABBITMQ_PID_FILE' variable
/usr/sbin/rabbitmq-server &
rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid
echo "RabbitMQ Started"
echo "RabbitMQ Started" >> ./rmq.txt

while true; do
  #ps $(cat /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid)
  ps -o pid,cmd,etime $(cat /var/lib/rabbitmq/mnesia/rabbit@$HOSTNAME.pid)
  if (($? > 0)); then
    echo "RabbitMQ Died"
    echo "RabbitMQ Died" >> ./rmq.txt
    exit 1
  fi
  #echo "Sleeping..."
  sleep 10
done
下面是脚本向supervisord生成的输出:

foo@bar:/# supervisorctl tail rmq

Starting RabbitMQ...
Waiting for rabbit@a2d2c8f9cad2 ...
pid is 45220 ...

              RabbitMQ 3.3.5. Copyright (C) 2007-2014 GoPivotal, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@a2d2c8f9cad2.log
  ######  ##        /var/log/rabbitmq/rabbit@a2d2c8f9cad2-sasl.log
  ##########
              Starting broker... completed with 0 plugins.
...done.
RabbitMQ Started
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:05
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:15
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:25
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:35
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:45
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:55
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:05
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:15
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:25

这对我起了部分作用。我用我的最终解决方案创建了一个要点:@caio虽然我的解决方案对我有效,但我应该感谢你的解决方案。它没有在/var/run/rabbitmq/目录中创建任何pid文件。这不是投票否决评论者的理由。事实上,如果没有该文件pid(可以使用可变环境设置),monit可能是一个非常有效的解决方案
foo@bar:/# supervisorctl tail rmq

Starting RabbitMQ...
Waiting for rabbit@a2d2c8f9cad2 ...
pid is 45220 ...

              RabbitMQ 3.3.5. Copyright (C) 2007-2014 GoPivotal, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@a2d2c8f9cad2.log
  ######  ##        /var/log/rabbitmq/rabbit@a2d2c8f9cad2-sasl.log
  ##########
              Starting broker... completed with 0 plugins.
...done.
RabbitMQ Started
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:05
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:15
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:25
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:35
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:45
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       00:55
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:05
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:15
  PID CMD                             ELAPSED
45220 /usr/lib/erlang/erts-6.1/bi       01:25