2011-10-11 217 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