2011-10-11 222 views
23

我supervisord.conf目前的部分看起来像:如何正确使用supervisord管理的RabbitMQ

[程序:RabbitMQ的] 命令=/usr/sbin目录/ RabbitMQ的服务器

当我试图阻止与supervisord的rabbitmq(supervisorctl stop rabbitmq),rabbitmq进程根本不关闭。 rabbitmq文档也提到从不使用kill,而是使用rabbitmqctl stop。我猜测supervisord只是简单地杀死进程 - 因此,rabbitmq的结果很差。我无法在supervisord中找到任何选项来指定自定义停止命令。

你有什么建议吗?

回答

2

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

没有很好的理由来管理RabbitMQ的任何更复杂的事情比一个尝试通过rabbitmqserver start重新启动的shell脚本更复杂。如果这种情况不能马上解决,那么RabbitMQ就会因为缺乏内存,磁盘空间不足或者一个流氓系统管理工具删除了一些rabbitmq二进制组件而变得很难。

在正常操作中,RabbitMQ有一个内部监控程序,它将尝试关闭并重新启动RabbitMQ,因此如果删除二进制文件,它将无法重新启动。使用厨师,puppet,cfengine等工具时,不要反复推出二进制包文件。只要检查一切都在那里,因为它应该是。

37

我的解决办法是写一个名为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 
+3

这部分工作对我来说。我用我的最终解决方案创建了一个要点:https://gist.github.com/caioariede/342a583f75467509ad42 – caio

+1

@ caio尽管我的解决方案适用于我,但我应该感谢您的支持。 –

0

我会建议你使用monit的(http://mmonit.com/ ),它更适合于RabbitMQ等守护进程,并且功能丰富。

首先,您必须安装Monit软件包。如果您位于Ubuntu/Debian下:

sudo apt-get update 
sudo apt-get install monit 

之后,您必须创建一个配置脚本。 下面是一个示例脚本,让你在运行(把它放在/etc/monit/conf.d/):

set daemon 1800 
set logfile /var/log/monit.log 

check process rabbit with pidfile /var/run/rabbitmq/pid 
    start program = "/etc/init.d/rabbitmq-server start" 
    stop program = "/etc/init.d/rabbitmq-server stop" 
    noalert [email protected] 

然后,只需重新启动的monit和你完成:

sudo /etc/init.d/monit restart 
+0

它不在/ var/run/rabbitmq /目录中创建任何pid文件。 –

+0

不是投票评论者的理由。事实上,如果不是针对该文件的pid,monit可能是完全有效的解决方案(可以使用可变环境进行设置......) –

3

这脚本启动RabbitMQ作为后台进程(使用'&'),这会导致更新/创建pid文件(请参阅http://www.rabbitmq.com/man/rabbitmqctl.1.man.html下的'wait')。

兔子启动后,会使用循环来验证pid是否仍在运行。如果兔子崩溃或手动关闭(在supervisord之外),那么脚本将以1退出并且supervisord接管。

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

supervisord很高兴,因为它可以看到正在运行的进程,并且EXIT将触发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/[email protected]$HOSTNAME.pid 
echo "RabbitMQ Started" 
echo "RabbitMQ Started" >> ./rmq.txt 

while true; do 
    #ps $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    ps -o pid,cmd,etime $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    if (($? > 0)); then 
    echo "RabbitMQ Died" 
    echo "RabbitMQ Died" >> ./rmq.txt 
    exit 1 
    fi 
    #echo "Sleeping..." 
    sleep 10 
done 

下面是由脚本生成到supervisord输出:

[email protected]:/# supervisorctl tail rmq 

Starting RabbitMQ... 
Waiting for [email protected] ... 
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/[email protected] 
    ###### ##  /var/log/rabbitmq/[email protected] 
    ########## 
       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