25

Supervisord.conf の現在のセクションは次のようになります。

[プログラム:rabbitmq] command=/usr/sbin/rabbitmq-server

Supervisord で rabbitmq を停止しようとすると (supervisorctl stop rabbitmq)、rabbitmq プロセスが単にシャットダウンしません。rabbitmq のドキュメントには、 kill を使用せずに rabbitmqctl stop を使用することも記載されています。私は、supervisord が単純にプロセスを強制終了すると推測しています。したがって、rabbitmq の結果は良くありません。カスタム停止コマンドを指定するためのオプションが Supervisord に見つかりませんでした。

おすすめはありますか?

4

4 に答える 4

38

私の解決策は、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 
于 2012-03-21T11:45:24.080 に答える
3

このスクリプトは、RabbitMQ をバックグラウンド プロセスとして開始し (「&」を使用)、pid ファイルを更新/作成します ( http://www.rabbitmq.com/man/rabbitmqctl.1.man.htmlの「wait」を参照) 。 .

ウサギが開始された後、ループを使用して pid がまだ実行中であることを確認します。ウサギがクラッシュしたり、(supervisord の外部で) 手動でシャットダウンした場合、スクリプトは 1 で終了し、supervisord が引き継ぎます。

echo >> ./rmq.txt ファイルはデバッグ目的であり、本番環境ではコメントアウトできます (これを使用して、起動/シャットダウン/停止状態を監視しました)。

実行中のプロセスを確認でき、EXIT が「rabbitmqctl stop」を呼び出してクリーン シャットダウンを行う stop_rmq 関数をトリガーするため、supervisord は満足しています。

#!/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
于 2014-08-22T14:39:27.400 に答える
3

あなたはあなた自身の質問に答えました。通常の操作では、文書化された通常の管理方法でない限り、プロセスで kill を使用しないでください。RabbitMQ の場合、文書化されたプロセスは、rabbitmqctl stop を使用するか、rabbitmqserver stop を使用することです。

rabbitmqserver start を介して再起動を試みるシェル スクリプトよりも洗練されたもので RabbitMQ を管理する正当な理由はありません。それがすぐに機能しない場合は、RabbitMQ が、RAM の不足、ディスク容量の不足、不正なシステム管理ツールによって rabbitmq バイナリ コンポーネントの一部が削除されたなどの理由で激しくダウンしています。

通常の操作では、RabbitMQ には、RabbitMQ のシャットダウンと再起動を試みる内部スーパーバイザーがあるため、バイナリを削除すると、再起動に失敗します。Chef、puppet、cfengine などのツールを使用する場合は、バイナリ パッケージ ファイルを繰り返しプッシュしないでください。すべてが本来あるべき姿であることを確認してください。

于 2012-01-29T06:53:05.937 に答える
1

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 foo@bar

次に、monit を再起動するだけで完了です。

 sudo /etc/init.d/monit restart
于 2013-06-03T14:09:47.437 に答える