2011-10-11 2 views
23

내 supervisord.conf의 현재 섹션과 같이 보인다 :제대로 supervisord와 rabbitmq을 관리하는 방법

[프로그램 : rabbitmq] 명령 =는/usr/sbin에/rabbitmq 서버

내가 막으려 supervisord (supervisorctl stop rabbitmq)가있는 rabbitmq는 rabbitmq 프로세스를 종료하지 않습니다. rabbitmq 문서에서는 kill을 사용하지 말고 rabbitmqctl stop을 사용합니다. 슈퍼 바이저가 단순히 프로세스를 죽인다는 것을 추측합니다. 따라서 rabbitmq을 사용하면 좋지 않은 결과를 얻을 수 있습니다. 맞춤 정지 명령을 지정하기 위해 수퍼바이저의 옵션을 찾을 수 없습니다.

권장 사항이 있습니까?

답변

2

고객님의 질문에 답변하셨습니다. 정상적인 작동에서 문서화 된 정상적인 관리 방법이 아닌 한 모든 프로세스에서 kill을 사용하지 마십시오. RabbitMQ의 경우, 문서화 된 프로세스는 rabbitmqctl stop을 사용하거나 rabbitmqserver stop을 사용하는 것입니다.

rabbitmqserver start를 통한 재시작을 시도하는 쉘 스크립트보다 정교한 RabbitMQ를 관리해야 할 이유가 없습니다. 그래도 문제가 해결되지 않으면 RabbitMQ는 RAM 부족, 디스크 공간 부족 또는 악성 시스템 관리 도구로 인해 rabbitmq 바이너리 구성 요소 중 일부가 삭제되어 어려워졌습니다.

정상 작동시 RabbitMQ에는 RabbitMQ를 종료하고 재시작하는 내부 감독자가 있으므로 바이너리를 삭제하면 다시 시작하지 못합니다. 요리사, 인형, cfengine과 같은 도구를 사용할 때 반복적으로 바이너리 패키지 파일을 푸시하지 마십시오. 그것이 있어야하는대로 모든 것이 있는지 확인하십시오. (

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

내 솔루션은 다음과 같이 래퍼 스크립트라는 이름의 rabbitmq.sh를 작성하는 것입니다), 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 
+3

이 나를 위해 부분적으로 일했다. 최종 솔루션으로 요점을 만들었습니다. https://gist.github.com/caioariede/342a583f75467509ad42 – caio

+1

@caio 제 솔루션이 저에게 효과적 일지 모르지만, 고맙겠습니다. –

0

난 당신이 MONIT를 사용하도록 권합니다 http://mmonit.com/ : 그 후

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

echo Starting rabbitmq 
rabbitmq-server 

을 supervisord.conf 수정 :

+0

/var/run/rabbitmq/디렉토리에 pid 파일이 생성되지 않습니다. –

+0

코멘트 작성자의 추천을 거부 한 이유가 아닙니다. 사실, monit은 파일 pid (변수 환경으로 설정할 수있는 경우)가 아니라면 완벽하게 유효한 솔루션 일 수 있습니다. –

3

이를 스크립트는 RabbitMQ를 백그라운드 프로세스 ('&'사용)로 시작하여 pid 파일을 업데이트/생성합니다 ('http://www.rabbitmq.com/man/rabbitmqctl.1.man.html'아래의 '대기'참조).

토끼가 시작된 후 루프가 사용되어 pid가 아직 실행 중인지 확인합니다. 토끼가 부러 지거나 수퍼 바이저 밖에서 수동으로 종료되면 스크립트가 1과 함께 종료되고 감독자가 인계합니다.

에코 >> ./rmq.txt 파일은 디버깅 목적으로 사용되며 프로덕션 환경에서 주석 처리 될 수 있습니다.이 파일을 사용하여 시작/종료/죽은 상태를 모니터링합니다.

실행중인 프로세스를 볼 수 있기 때문에 supervisord가 만족스럽고 EXIT가 깨끗한 종료를 위해 'rabbitmqctl stop'을 호출하는 stop_rmq 기능을 트리거합니다.

#!/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