Подтвердить что ты не робот

Как правильно управлять кроликом с помощью супервизора

Текущий раздел в моем supervisord.conf выглядит так:

[Программа: RabbitMQ] Команда =/USR/SBIN/RabbitMQ-сервер

Когда я пытаюсь остановить кроличмень с помощью супервизора (superisorctl stop rabbitmq), процессы rabbitmq просто не закрываются. Документация rabbitmq также упоминает о том, чтобы никогда не использовать kill, а использовать stopbitbitq. Я предполагаю, что супервизор просто убивает процессы - отсюда и плохие результаты с кроликом. Я не мог найти какие-либо опции в супервизоре, чтобы указать пользовательскую команду остановки.

Есть ли у вас рекомендации?

4b9b3361

Ответ 1

Мое решение - написать оболочку script с именем 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 

Ответ 2

Этот script запускает RabbitMQ в качестве фонового процесса (используя '&'), который вызывает обновление/создание pid файла (см. "wait" под http://www.rabbitmq.com/man/rabbitmqctl.1.man.html).

После запуска кролика для проверки того, что pid все еще работает, используется цикл. Если сбой кроликов или ручное закрытие (за пределами супервизора), то script выйдет с 1, а контроль над ним займет.

Файл 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

Здесь вывод, сгенерированный script супервизором:

[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

Ответ 3

Вы ответили на свой вопрос. При нормальной работе никогда не используйте kill в любом процессе, если это не документированный нормальный способ управления им. В случае с RabbitMQ документированный процесс заключается в использовании остановки rabbitmqctl или использовании остановки rabbitmqserver.

Нет никаких оснований для управления RabbitMQ с чем-то более сложным, чем оболочка script, которая делает попытку перезапуска с запуском rabbitmqserver. Если это не сработает сразу, то RabbitMQ не работает из-за чего-то вроде нехватки ОЗУ, закончилось свободное место на диске, или инструмент управления системой изгоев удалил некоторые из бинарных компонентов rabbitmq.

В обычной работе RabbitMQ имеет внутренний супервизор, который попытается выключить и перезапустить RabbitMQ, поэтому, если вы удалите двоичные файлы, он не сможет перезагрузиться. При использовании таких инструментов, как chef, puppet, cfengine, не выставляйте многократно файлы двоичных файлов. Просто убедитесь, что все есть так, как должно быть.

Ответ 4

Я бы посоветовал вам использовать Monit (http://mmonit.com/), он лучше подходит для демонов, таких как RabbitMQ, и он также богат функциями.

Прежде всего, вы должны установить пакет Monit. Если вы находитесь под Ubuntu/Debian:

sudo apt-get update
sudo apt-get install monit

Затем вы должны создать конфигурацию script. Вот пример script, чтобы заставить вас работать (поместите его на /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