`

rabbitmq3.4.2 shell脚本分析

阅读更多
rabbitmq3.4.2 shell脚本分析 http://aperise.iteye.com/blog/2346584
rabbitmq3.4.2单机安装和集群安装 http://aperise.iteye.com/blog/2346179
rabbitmq3.4.1脑裂问题(转载) http://blog.csdn.net/u013256816/article/details/53291907
spring-amqp官方文档(转载) http://projects.spring.io/spring-amqp/#quick-start
spring-amqp在GITHUB源码(转载) https://github.com/spring-projects/spring-amqp
  • rabbitmq3.4.2提供了哪些shell脚本?脚本之间调用关系?
  • rabbitmq3.4.2各个shell脚本详细解析?
  • rabbitmq3.4.2的默认配置文件在哪里?默认插件放在哪里?日志放在哪里?
  • 为什么有了rabitmqctl还需要RabbitMQ Management plugin?
  • Rattitmq Management plugin提供了哪些功能?

1.rabbitmq3.4.2提供了哪些shell脚本?脚本之间调用关系?

    这里安装的rabbitmq版本为3.4.2,安装方式是编译安装,安装位于目录/opt/rabbitmq-3.4.2,在/opt/rabbitmq-server-3.4.2/sbin下面提供了如下5个shell脚本:

脚本 说明
rabbitmq-defaults shell脚本,初始化关键的配置默认信息
rabbitmq-env shell脚本,设置运行环境各种默认配置
rabbitmqctl

rabbitmqctl本质是shell脚本里通过erl运行程序

/opt//opt/rabbitmq-server-3.4.2

/ebin/rabbit_control_main.beam这个erlang程序

rabbitmq-plugins

rabbitmq-plugins本质是shell脚本里通过erl运行

/opt/rabbitmq-server-3.4.2

/ebin/rabbit_plugins.beam这个erlang程序

rabbitmq-server

rabbitmq-server本质是shell通过erl运行

/opt/rabbitmq-server-3.4.2

/ebin/rrabbit.beam这个erlang程序

 

    从上面图可以看出:5个脚本其实平时用到最多的是rabbitmqctl、rabbitmq-server、rabbitmq-plugins,而rabbitmq-env和rabbitmq-defaults是前面3个脚本的运行前提,主要提供运行环境的初始设置和整个环境的默认设置,在用户未做任何配置情况下,这些脚本本身就考虑到了很多默认设置,方便用户使用,在必要时候提醒相关错误信息

 

2.rabbitmq3.4.2各个shell脚本详细解析?

    2.1 linux中shell变量的含义: 

  • $$      Shell本身的PID(ProcessID) 
  • $!      Shell最后运行的后台Process的PID 
  • $?      最后运行的命令的结束代码(返回值) 
  • $-      使用Set命令设定的Flag一览 
  • $*      所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
  • $@      所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
  • $#      添加到Shell的参数个数 
  • $0      Shell本身的文件名 
  • $1~$n  添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 

    2.2 rabbitmq-defaults

#!/bin/sh -e
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2012-2014 GoPivotal, Inc.  All rights reserved.
##

### next line potentially updated in package install steps
SYS_PREFIX=

### next line will be updated when generating a standalone release
ERL_DIR=

CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl

## Set default values

# 继承rabbitmq-env已有配置的子配置文件,注意不是目录
CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
# 日志文件目录,注意不是文件
LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
# 数据库目录,注意不是文件
MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
# 记录启用的插件的文件,注意不是目录
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins

# 插件所在目录
PLUGINS_DIR="${RABBITMQ_HOME}/plugins"

# rabbitmq相关环境配置文件
CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf

    这里为了打印rabbitmq-defaults里的变量值,故在rabbitmq-defaults文件里末尾追加如下脚本,如下:

echo "SYS_PREFIX:"${SYS_PREFIX}
echo "CLEAN_BOOT_FILE:"${CLEAN_BOOT_FILE}
echo "SASL_BOOT_FILE:"${SASL_BOOT_FILE}
echo "CONFIG_FILE:"${CONFIG_FILE}
echo "LOG_BASE:"${LOG_BASE}
echo "MNESIA_BASE:"${MNESIA_BASE}
echo "ENABLED_PLUGINS_FILE:"${ENABLED_PLUGINS_FILE}
echo "PLUGINS_DIR:"${PLUGINS_DIR}
echo "CONF_ENV_FILE:"${CONF_ENV_FILE}

    然后执行rabbitmq-defaults得到的结果如下:

[root@slavery01 sbin]# rabbitmq-defaults 
SYS_PREFIX:
CLEAN_BOOT_FILE:start_clean
SASL_BOOT_FILE:start_sasl
CONFIG_FILE:/etc/rabbitmq/rabbitmq
LOG_BASE:/var/log/rabbitmq
MNESIA_BASE:/var/lib/rabbitmq/mnesia
ENABLED_PLUGINS_FILE:/etc/rabbitmq/enabled_plugins
PLUGINS_DIR:/plugins
CONF_ENV_FILE:/etc/rabbitmq/rabbitmq-env.conf
[root@slavery01 sbin]# 

    说明:

  • sbin/rabbitmq-defaults主要初始化了几个重要的变量值,这些值如果你要修改,请不要修改文件sbin/rabbitmq-defaults文件,这个文件是初始化的默认值,要覆盖的话,请在文件/etc/rabbitmq/rabbitmq文件中进行修改;
  • 如果安装完后rabbitmq不做任何配置,默认rabbitmq的配置文件为/etc/rabbitmq/rabbitmq,环境配置文件为/etc/rabbitmq/rabbitmq-env.conf,日志放置目录为/var/log/rabbitmq ,数据持久化目录为/var/lib/rabbitmq/mnesia,启用的插件目录位于/etc/rabbitmq/enabled_plugins
  • 上面这些默认配置很关键,在很多博客是一上来就生硬的告诉读者去/etc/rabbitmq目录配置rabbitmq相关信息,所以学习任何一门开源框架技术,搞懂其脚本调用关系和脚本详细执行过程,特别是里面的变量,对于快速学习非常重要。

 

    2.3 rabbitmq-env

#!/bin/sh -e
#shell编程是以"#"为注释,但对"#!/bin/sh"却不是。"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
##

# We set +e here since since our test for "readlink -f" below needs to
# be able to fail.
set +e
# Determine where this script is really located (if this script is
# invoked from another script, this is the location of the caller)
SCRIPT_PATH="$0"    #shell自身的文件名,这里指/opt/rabbitmq-server-3.4.2/sbin/rabbitmq-env
while [ -h "$SCRIPT_PATH" ] ; do    # -h 用于判定是否为符号链接
    # Determine if readlink -f is supported at all. TODO clean this up.
    # readlink -f 获取符号链接 rabbitmq-env 所对应的完整路径 /opt/rabbitmq-server-3.4.2/sbin/rabbitmq-env
    FULL_PATH=`readlink -f $SCRIPT_PATH 2>/dev/null`
    if [ "$?" != "0" ]; then     # 判定上一步执行结果是否为成功
      REL_PATH=`readlink $SCRIPT_PATH`    #执行readlink获取符号链接rabbitmq-env所对应的相对路径 ../sbin/rabbitmq-env
      #正则表达式判定 $REL_PATH 是不是以 '/' 开头
      if expr "$REL_PATH" : '/.*' > /dev/null; then
        SCRIPT_PATH="$REL_PATH"    #如果是以 '/' 开头
      else
        SCRIPT_PATH="`dirname "$SCRIPT_PATH"`/$REL_PATH"    #如果不是以 '/' 开头
      fi
    else
      SCRIPT_PATH=$FULL_PATH
    fi
done
set -e

SCRIPT_DIR=`dirname $SCRIPT_PATH`    # 得到 SCRIPT_DIR = /opt/rabbitmq-server-3.4.2/sbin
RABBITMQ_HOME="${SCRIPT_DIR}/.."     # 得到 RABBITMQ_HOME = /opt/rabbitmq-server-3.4.2/sbin/..

## Set defaults
. ${SCRIPT_DIR}/rabbitmq-defaults    # 调用并执行脚本rabbitmq-defaults

## Common defaults
# 默认的通用配置选项SERVER_ERL_ARGS=+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true}]
SERVER_ERL_ARGS="+K true +A30 +P 1048576 \
  -kernel inet_default_connect_options [{nodelay,true}]"    

# warn about old rabbitmq.conf file, if no new one
if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
   [ ! -f ${CONF_ENV_FILE} ] ; then
    echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- "
    echo "location has moved to ${CONF_ENV_FILE}"
fi

## Get configuration variables from the configure environment file
[ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} || true

[ "x" = "x$RABBITMQ_USE_LONGNAME" ] && RABBITMQ_USE_LONGNAME=${USE_LONGNAME}
if [ "xtrue" = "x$RABBITMQ_USE_LONGNAME" ] ; then
    RABBITMQ_NAME_TYPE=-name
    [ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname --fqdn`
    [ "x" = "x$NODENAME" ] && NODENAME=rabbit@${HOSTNAME}
else
    RABBITMQ_NAME_TYPE=-sname
    [ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname`
    [ "x" = "x$NODENAME" ] && NODENAME=rabbit@${HOSTNAME%%.*}
fi

##--- Set environment vars RABBITMQ_<var_name> to defaults if not set
#如果相关参数没有配置那么表达式"x" = "x$参数KEY"永远成立,则设置相关参数的默认值
DEFAULT_NODE_IP_ADDRESS=auto
DEFAULT_NODE_PORT=5672
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${NODE_PORT}

[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_IP_ADDRESS=${DEFAULT_NODE_IP_ADDRESS}
[ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${DEFAULT_NODE_PORT}

[ "x" = "x$RABBITMQ_DIST_PORT" ] && RABBITMQ_DIST_PORT=${DIST_PORT}
[ "x" = "x$RABBITMQ_DIST_PORT" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_DIST_PORT=$((${DEFAULT_NODE_PORT} + 20000))
[ "x" = "x$RABBITMQ_DIST_PORT" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_DIST_PORT=$((${RABBITMQ_NODE_PORT} + 20000))

[ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=${NODENAME}
[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_SERVER_ERL_ARGS=${SERVER_ERL_ARGS}
[ "x" = "x$RABBITMQ_CONFIG_FILE" ] && RABBITMQ_CONFIG_FILE=${CONFIG_FILE}
[ "x" = "x$RABBITMQ_LOG_BASE" ] && RABBITMQ_LOG_BASE=${LOG_BASE}
[ "x" = "x$RABBITMQ_MNESIA_BASE" ] && RABBITMQ_MNESIA_BASE=${MNESIA_BASE}
[ "x" = "x$RABBITMQ_SERVER_START_ARGS" ] && RABBITMQ_SERVER_START_ARGS=${SERVER_START_ARGS}
[ "x" = "x$RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS" ] && RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=${SERVER_ADDITIONAL_ERL_ARGS}
[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${MNESIA_DIR}
[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}

[ "x" = "x$RABBITMQ_PID_FILE" ] && RABBITMQ_PID_FILE=${PID_FILE}
[ "x" = "x$RABBITMQ_PID_FILE" ] && RABBITMQ_PID_FILE=${RABBITMQ_MNESIA_DIR}.pid

[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand

[ "x" = "x$RABBITMQ_ENABLED_PLUGINS_FILE" ] && RABBITMQ_ENABLED_PLUGINS_FILE=${ENABLED_PLUGINS_FILE}

[ "x" = "x$RABBITMQ_PLUGINS_DIR" ] && RABBITMQ_PLUGINS_DIR=${PLUGINS_DIR}

## Log rotation
[ "x" = "x$RABBITMQ_LOGS" ] && RABBITMQ_LOGS=${LOGS}
[ "x" = "x$RABBITMQ_LOGS" ] && RABBITMQ_LOGS="${RABBITMQ_LOG_BASE}/${RABBITMQ_NODENAME}.log"
[ "x" = "x$RABBITMQ_SASL_LOGS" ] && RABBITMQ_SASL_LOGS=${SASL_LOGS}
[ "x" = "x$RABBITMQ_SASL_LOGS" ] && RABBITMQ_SASL_LOGS="${RABBITMQ_LOG_BASE}/${RABBITMQ_NODENAME}-sasl.log"

[ "x" = "x$RABBITMQ_CTL_ERL_ARGS" ] && RABBITMQ_CTL_ERL_ARGS=${CTL_ERL_ARGS}

##--- End of overridden <var_name> variables

    这里为了打印rabbitmq-env里的变量值,故在rabbitmq-env文件里末尾追加如下脚本,如下:

echo "SCRIPT_PATH:"${SCRIPT_PATH}
echo "SCRIPT_DIR:"${SCRIPT_DIR}
echo "RABBITMQ_HOME:"${RABBITMQ_HOME}
echo "SERVER_ERL_ARGS:"${SERVER_ERL_ARGS}
echo "CONF_ENV_FILE:"${CONF_ENV_FILE}
echo "RABBITMQ_USE_LONGNAME:"${RABBITMQ_USE_LONGNAME}
echo "HOSTNAME:"${HOSTNAME}
echo "NODENAME:"${NODENAME}
echo "RABBITMQ_NODE_IP_ADDRESS:"${RABBITMQ_NODE_IP_ADDRESS}
echo "RABBITMQ_NODE_PORT:"${RABBITMQ_NODE_PORT}
echo "RABBITMQ_DIST_PORT:"${RABBITMQ_DIST_PORT}
echo "RABBITMQ_NODENAME:"${RABBITMQ_NODENAME}
echo "RABBITMQ_SERVER_ERL_ARGS:"${RABBITMQ_SERVER_ERL_ARGS}
echo "RABBITMQ_CONFIG_FILE:"${RABBITMQ_CONFIG_FILE}
echo "RABBITMQ_LOG_BASE:"${RABBITMQ_LOG_BASE}
echo "RABBITMQ_MNESIA_BASE:"${RABBITMQ_MNESIA_BASE}
echo "RABBITMQ_SERVER_START_ARGS:"${RABBITMQ_SERVER_START_ARGS}
echo "RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS:"${RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS}
echo "RABBITMQ_MNESIA_DIR:"${RABBITMQ_MNESIA_DIR}
echo "RABBITMQ_PID_FILE:"${RABBITMQ_PID_FILE}
echo "RABBITMQ_PLUGINS_EXPAND_DIR:"${RABBITMQ_PLUGINS_EXPAND_DIR}
echo "RABBITMQ_ENABLED_PLUGINS_FILE:"${RABBITMQ_ENABLED_PLUGINS_FILE}
echo "RABBITMQ_PLUGINS_DIR:"${RABBITMQ_PLUGINS_DIR}
echo "RABBITMQ_LOGS:"${RABBITMQ_LOGS}
echo "RABBITMQ_SASL_LOGS:"${RABBITMQ_SASL_LOGS}
echo "RABBITMQ_CTL_ERL_ARGS:"${RABBITMQ_CTL_ERL_ARGS}

    然后执行rabbitmq-env得到的结果如下:

[root@slavery01 sbin]# rabbitmq-env 
SCRIPT_PATH:/opt/rabbitmq-server-3.4.2/sbin/rabbitmq-env
SCRIPT_DIR:/opt/rabbitmq-server-3.4.2/sbin
RABBITMQ_HOME:/opt/rabbitmq-server-3.4.2/sbin/..
SERVER_ERL_ARGS:+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true}]
CONF_ENV_FILE:/etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_USE_LONGNAME:
HOSTNAME:slavery01
NODENAME:rabbit@slavery01
RABBITMQ_NODE_IP_ADDRESS:
RABBITMQ_NODE_PORT:
RABBITMQ_DIST_PORT:25672
RABBITMQ_NODENAME:rabbit@slavery01
RABBITMQ_SERVER_ERL_ARGS:+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true}]
RABBITMQ_CONFIG_FILE:/etc/rabbitmq/rabbitmq
RABBITMQ_LOG_BASE:/var/log/rabbitmq
RABBITMQ_MNESIA_BASE:/var/lib/rabbitmq/mnesia
RABBITMQ_SERVER_START_ARGS:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS:
RABBITMQ_MNESIA_DIR:/var/lib/rabbitmq/mnesia/rabbit@slavery01
RABBITMQ_PID_FILE:/var/lib/rabbitmq/mnesia/rabbit@slavery01.pid
RABBITMQ_PLUGINS_EXPAND_DIR:/var/lib/rabbitmq/mnesia/rabbit@slavery01-plugins-expand
RABBITMQ_ENABLED_PLUGINS_FILE:/etc/rabbitmq/enabled_plugins
RABBITMQ_PLUGINS_DIR:/opt/rabbitmq-server-3.4.2/sbin/../plugins
RABBITMQ_LOGS:/var/log/rabbitmq/rabbit@slavery01.log
RABBITMQ_SASL_LOGS:/var/log/rabbitmq/rabbit@slavery01-sasl.log
RABBITMQ_CTL_ERL_ARGS:
[root@slavery01 sbin]# 

    说明:

  • sbin/rabbitmq-env是对所有环境变量进行默认设置;
  • 如果你要修改默认环境变量值,请在文件/etc/rabbitmq/rabbitmq-env.conf进行修改;

 

    2.4 rabbitmqctl

#!/bin/sh -e
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
##

# Get default settings with user overrides for (RABBITMQ_)<var_name>
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env    #调用并执行脚本rabbitmq-env

#epmd是Erlang Port Mapper Daemon的缩写,epmd完成Erlang节点和IP,端口的映射关系,首先要保证epmd处于运行状态,这里先让它运行
# rabbitmqctl starts distribution itself, so we need to make sure epmd
# is running.
${ERL_DIR}erl ${RABBITMQ_NAME_TYPE} rabbitmqctl-prelaunch-$$ -noinput \
-eval 'erlang:halt().' -boot "${CLEAN_BOOT_FILE}"

# We specify Mnesia dir and sasl error logger since some actions
# (e.g. forget_cluster_node --offline) require us to impersonate the
# real node.
RABBITMQ_USE_LONGNAME=${RABBITMQ_USE_LONGNAME} \
exec ${ERL_DIR}erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_CTL_ERL_ARGS} \
    -boot "${CLEAN_BOOT_FILE}" \
    -sasl errlog_type error \
    -mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \
    -s rabbit_control_main \
    -nodename $RABBITMQ_NODENAME \
    -extra "$@"

    这里为了打印rabbitmqctl里的变量值,故在rabbitmqctl文件里末尾追加如下脚本,如下:

 

 

echo "ERL_DIR:"${ERL_DIR}
echo "RABBITMQ_NAME_TYPE:"${RABBITMQ_NAME_TYPE}
echo "CLEAN_BOOT_FILE:"${CLEAN_BOOT_FILE}
echo "RABBITMQ_USE_LONGNAME:"${RABBITMQ_USE_LONGNAME}
echo "RABBITMQ_HOME:"${RABBITMQ_HOME}
echo "RABBITMQ_CTL_ERL_ARGS:"${RABBITMQ_CTL_ERL_ARGS}
echo "RABBITMQ_MNESIA_DIR:"${RABBITMQ_MNESIA_DIR}
echo "RABBITMQ_NODENAME:"${RABBITMQ_NODENAME}

    然后执行rabbitmqctl得到的结果如下:

[root@slavery01 sbin]# rabbitmqctl
ERL_DIR:
RABBITMQ_NAME_TYPE:-sname
CLEAN_BOOT_FILE:start_clean
RABBITMQ_USE_LONGNAME:
RABBITMQ_HOME:/opt/rabbitmq-server-3.4.2/sbin/..
RABBITMQ_CTL_ERL_ARGS:
RABBITMQ_MNESIA_DIR:/var/lib/rabbitmq/mnesia/rabbit@slavery01
RABBITMQ_NODENAME:rabbit@slavery01
[root@slavery01 sbin]#

    说明:

  • sbin/rabbitmqctl本质是shell脚本里通过erl运行程序/opt//opt/rabbitmq-server-3.4.2/ebin/rabbit_control_main.beam这个erlang程序;
  • rabbitmqctl需要erlang语言环境支持,不然无法运行;

 

    2.5 rabbitmq-plugins

#!/bin/sh -e
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
##

# Get default settings with user overrides for (RABBITMQ_)<var_name>
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env    #调用并执行脚本rabbitmq-env

exec ${ERL_DIR}erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_NAME_TYPE} rabbitmq-plugins$$ \
    -boot "${CLEAN_BOOT_FILE}" \
    -s rabbit_plugins_main \
    -enabled_plugins_file "$RABBITMQ_ENABLED_PLUGINS_FILE" \
    -plugins_dist_dir "$RABBITMQ_PLUGINS_DIR" \
    -nodename $RABB

    这里为了打印rabbitmq-plugins里的变量值,故在rabbitmq-plugins文件里末尾追加如下脚本,如下:

echo "ERL_DIR:"${ERL_DIR}
echo "RABBITMQ_HOME:"${RABBITMQ_HOME}
echo "RABBITMQ_NAME_TYPE:"${RABBITMQ_NAME_TYPE}
echo "CLEAN_BOOT_FILE:"${CLEAN_BOOT_FILE}
echo "RABBITMQ_ENABLED_PLUGINS_FILE:"${RABBITMQ_ENABLED_PLUGINS_FILE}
echo "RABBITMQ_PLUGINS_DIR:"${RABBITMQ_PLUGINS_DIR}
echo "RABB:"${RABB}

    然后执行rabbitmq-plugins得到的结果如下:

[root@slavery01 sbin]# rabbitmq-plugins 
ERL_DIR:
RABBITMQ_HOME:/opt/rabbitmq-server-3.4.2/sbin/..
RABBITMQ_NAME_TYPE:-sname
CLEAN_BOOT_FILE:start_clean
RABBITMQ_ENABLED_PLUGINS_FILE:/etc/rabbitmq/enabled_plugins
RABBITMQ_PLUGINS_DIR:/opt/rabbitmq-server-3.4.2/sbin/../plugins
RABB:
[root@slavery01 sbin]#

   说明:

  • rabbitmq-plugins本质是shell脚本里通过erl运行/opt/rabbitmq-server-3.4.2/ebin/rabbit_plugins.beam这个erlang程序;
  • rabbitmq-plugins需要erlang语言环境支持;
  • rabbitmq-plugins主要用于插件管理;

 

    2.6 rabbitmq-server

#!/bin/sh -e
#shell编程是以"#"为注释,但对"#!/bin/sh"却不是。"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
##

# Get default settings with user overrides for (RABBITMQ_)<var_name>
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env    #调用并执行脚本rabbitmq-env

#如果相关参数没有配置,那么表达式"x" = "x$参数KEY"永远成立,则设置相关参数的默认值
RABBITMQ_START_RABBIT=
[ "x" = "x$RABBITMQ_ALLOW_INPUT" ] && RABBITMQ_START_RABBIT=" -noinput"
[ "x" = "x$RABBITMQ_NODE_ONLY" ] && RABBITMQ_START_RABBIT="$RABBITMQ_START_RABBIT -s rabbit boot "

#CYGWIN不会记录进程ID
#后台运行模式时候不会生成进程ID文件
case "$(uname -s)" in
  CYGWIN*) # we make no attempt to record the cygwin pid; rabbitmqctl wait
           # will not be able to make sense of it anyway
           ;;
  *)       # When -detached is passed, we don't write the pid, since it'd be the
           # wrong one
           detached=""
           for opt in "$@"; do
               if [ "$opt" = "-detached" ]; then
                   detached="true"
               fi
           done
           if [ $detached ]; then
               echo "Warning: PID file not written; -detached was passed." 1>&2
           else
               mkdir -p $(dirname ${RABBITMQ_PID_FILE});
               echo $$ > ${RABBITMQ_PID_FILE}
           fi
esac

RABBITMQ_EBIN_ROOT="${RABBITMQ_HOME}/ebin"

#告诉bash如果后续任何语句的执行结果不是true则应该退出
set +e

RABBITMQ_CONFIG_FILE=$RABBITMQ_CONFIG_FILE \
RABBITMQ_DIST_PORT=$RABBITMQ_DIST_PORT \
    ${ERL_DIR}erl -pa "$RABBITMQ_EBIN_ROOT" \
    -boot "${CLEAN_BOOT_FILE}" \
    -noinput \
    -hidden \
    -s rabbit_prelaunch \
    ${RABBITMQ_NAME_TYPE} rabbitmqprelaunch$$ \
    -extra "${RABBITMQ_NODENAME}"

PRELAUNCH_RESULT=$?
if [ ${PRELAUNCH_RESULT} = 2 ] ; then
    # dist port is mentioned in config, so do not set it
    true
elif [ ${PRELAUNCH_RESULT} = 0 ] ; then
    # dist port is not mentioned in the config file, we can set it
    RABBITMQ_DIST_ARG="-kernel inet_dist_listen_min ${RABBITMQ_DIST_PORT} -kernel inet_dist_listen_max ${RABBITMQ_DIST_PORT}"
else
    exit ${PRELAUNCH_RESULT}
fi

set -e

RABBITMQ_CONFIG_ARG=
[ -f "${RABBITMQ_CONFIG_FILE}.config" ] && RABBITMQ_CONFIG_ARG="-config ${RABBITMQ_CONFIG_FILE}"

RABBITMQ_LISTEN_ARG=
[ "x" != "x$RABBITMQ_NODE_PORT" ] && [ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_LISTEN_ARG="-rabbit tcp_listeners [{\""${RABBITMQ_NODE_IP_ADDRESS}"\","${RABBITMQ_NODE_PORT}"}]"

# we need to turn off path expansion because some of the vars, notably
# RABBITMQ_SERVER_ERL_ARGS, contain terms that look like globs and
# there is no other way of preventing their expansion.
set -f

RABBITMQ_CONFIG_FILE=$RABBITMQ_CONFIG_FILE \
exec ${ERL_DIR}erl \
    -pa ${RABBITMQ_EBIN_ROOT} \
    ${RABBITMQ_START_RABBIT} \
    ${RABBITMQ_NAME_TYPE} ${RABBITMQ_NODENAME} \
    -boot "${SASL_BOOT_FILE}" \
    ${RABBITMQ_CONFIG_ARG} \
    +W w \
    ${RABBITMQ_SERVER_ERL_ARGS} \
    ${RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS} \
    ${RABBITMQ_LISTEN_ARG} \
    -sasl errlog_type error \
    -sasl sasl_error_logger false \
    -rabbit error_logger '{file,"'${RABBITMQ_LOGS}'"}' \
    -rabbit sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
    -rabbit enabled_plugins_file "\"$RABBITMQ_ENABLED_PLUGINS_FILE\"" \
    -rabbit plugins_dir "\"$RABBITMQ_PLUGINS_DIR\"" \
    -rabbit plugins_expand_dir "\"$RABBITMQ_PLUGINS_EXPAND_DIR\"" \
    -os_mon start_cpu_sup false \
    -os_mon start_disksup false \
    -os_mon start_memsup false \
    -mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \
    ${RABBITMQ_SERVER_START_ARGS} \
    ${RABBITMQ_DIST_ARG} \
    "$@"

    这里为了打印rabbitmq-server里的变量值,故在rabbitmq-server文件里末尾追加如下脚本,如下:

 

 

echo "RABBITMQ_START_RABBIT:"${RABBITMQ_START_RABBIT}
echo "RABBITMQ_ALLOW_INPUT:"${RABBITMQ_ALLOW_INPUT}
echo "RABBITMQ_NODE_ONLY:"${RABBITMQ_NODE_ONLY}
echo "RABBITMQ_PID_FILE:"${RABBITMQ_PID_FILE}
echo "RABBITMQ_HOME:"${RABBITMQ_HOME}
echo "RABBITMQ_EBIN_ROOT:"${RABBITMQ_EBIN_ROOT}
echo "RABBITMQ_CONFIG_FILE:"${RABBITMQ_CONFIG_FILE}
echo "ERL_DIR:"${ERL_DIR}
echo "CLEAN_BOOT_FILE:"${CLEAN_BOOT_FILE}
echo "RABBITMQ_NAME_TYPE:"${RABBITMQ_NAME_TYPE}
echo "RABBITMQ_NODENAME:"${RABBITMQ_NODENAME}
echo "PRELAUNCH_RESULT:"${PRELAUNCH_RESULT}
echo "RABBITMQ_DIST_ARG:"${RABBITMQ_DIST_ARG}
echo "RABBITMQ_DIST_PORT:"${RABBITMQ_DIST_PORT}
echo "RABBITMQ_CONFIG_ARG:"${RABBITMQ_CONFIG_ARG}
echo "RABBITMQ_NODE_PORT:"${RABBITMQ_NODE_PORT}
echo "RABBITMQ_NODE_IP_ADDRESS:"${RABBITMQ_NODE_IP_ADDRESS}
echo "SASL_BOOT_FILE:"${SASL_BOOT_FILE}
echo "RABBITMQ_SERVER_ERL_ARGS:"${RABBITMQ_SERVER_ERL_ARGS}
echo "RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS:"${RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS}
echo "RABBITMQ_LISTEN_ARG:"${RABBITMQ_LISTEN_ARG}
echo "RABBITMQ_LOGS:"${RABBITMQ_LOGS}
echo "RABBITMQ_SASL_LOGS:"${RABBITMQ_SASL_LOGS}
echo "RABBITMQ_ENABLED_PLUGINS_FILE:"${RABBITMQ_ENABLED_PLUGINS_FILE}
echo "RABBITMQ_PLUGINS_DIR:"${RABBITMQ_PLUGINS_DIR}
echo "RABBITMQ_PLUGINS_EXPAND_DIR:"${RABBITMQ_PLUGINS_EXPAND_DIR}
echo "RABBITMQ_MNESIA_DIR:"${RABBITMQ_MNESIA_DIR}
echo "RABBITMQ_SERVER_START_ARGS:"${RABBITMQ_SERVER_START_ARGS}
echo "RABBITMQ_DIST_ARG:"${RABBITMQ_DIST_ARG}

    然后执行rabbitmq-server得到的结果如下:

[root@slavery01 sbin]# rabbitmq-server
RABBITMQ_START_RABBIT: -noinput -s rabbit boot
RABBITMQ_ALLOW_INPUT:
RABBITMQ_NODE_ONLY:
RABBITMQ_PID_FILE:/var/lib/rabbitmq/mnesia/rabbit@slavery01.pid
RABBITMQ_HOME:/opt/rabbitmq-server-3.4.2/sbin/..
RABBITMQ_EBIN_ROOT:/opt/rabbitmq-server-3.4.2/sbin/../ebin
RABBITMQ_CONFIG_FILE:/etc/rabbitmq/rabbitmq
ERL_DIR:
CLEAN_BOOT_FILE:start_clean
RABBITMQ_NAME_TYPE:-sname
RABBITMQ_NODENAME:rabbit@slavery01
PRELAUNCH_RESULT:0
RABBITMQ_DIST_ARG:-kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
RABBITMQ_DIST_PORT:25672
RABBITMQ_CONFIG_ARG:
RABBITMQ_NODE_PORT:
RABBITMQ_NODE_IP_ADDRESS:
SASL_BOOT_FILE:start_sasl
RABBITMQ_SERVER_ERL_ARGS:+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true}]
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS:
RABBITMQ_LISTEN_ARG:
RABBITMQ_LOGS:/var/log/rabbitmq/rabbit@slavery01.log
RABBITMQ_SASL_LOGS:/var/log/rabbitmq/rabbit@slavery01-sasl.log
RABBITMQ_ENABLED_PLUGINS_FILE:/etc/rabbitmq/enabled_plugins
RABBITMQ_PLUGINS_DIR:/opt/rabbitmq-server-3.4.2/sbin/../plugins
RABBITMQ_PLUGINS_EXPAND_DIR:/var/lib/rabbitmq/mnesia/rabbit@slavery01-plugins-expand
RABBITMQ_MNESIA_DIR:/var/lib/rabbitmq/mnesia/rabbit@slavery01
RABBITMQ_SERVER_START_ARGS:
RABBITMQ_DIST_ARG:-kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
[root@slavery01 sbin]# rabbitmq-server

    说明:

  • rabbitmq-server本质是shell通过erl运行/opt/rabbitmq-server-3.4.2/ebin/rrabbit.beam这个erlang程序;
  • rabbitmq-server需要erlang语言环境支持;

 

3.rabbitmq3.4.2的默认配置文件在哪里?默认插件放在哪里?日志放在哪里?

默认配置项 默认配置项值
默认配置文件目录 /etc/rabbitmq/rabbitmq
默认日志文件目录 /var/log/rabbitmq
默认数据库目录 /var/lib/rabbitmq/mnesia
默认激活插件的目录 /etc/rabbitmq/enabled_plugins
默认插件所在目录 /opt/rabbitmq-3.4.2/plugins
默认rabbitmq相关环境配置文件 /etc/rabbitmq/rabbitmq-env.conf

 

4.为什么有了 rabbitmqctl 还需要 RabbitMQ Management plugin?

  •     原因一:rabbitmqctl需要有Erlang运行环境支持,必须和rabbitmq集群使用相同的.erlang.cookie;
  •     原因二:就算有了一种的条件,那么拿到这个权限就可以操作一切,比较危险;
  •     原因三:不是所有人都喜欢使用rabbitmqctl这种CLI命令,不如界面点击灵活可视化效果好;
  •     原因四:rabbitmqctl难于与其他编程语言集成。

 

5.RabbitMQ Management plugin 提供了哪些功能?

    Web interface        通过鼠标点击就可以查看各种信息,WEB UI提供了在 rabbitmq server 上的可视化操作;

    REST interface      通过HTTP URI实现对各种功能的访问.REST API 提供了一种与其他语言和工具集成的方式.返回的结构均以JSON格式提供,故需要支持JSON解析,需要支持HTTP basic authentication,需要手动构造完整的 HTTP request.支持对返回结果的排序,显示过滤,以及获取历史数据;

    CLI interface          rabbitmqadmin 脚本访问 (Python2.x).CLI interface 优于 REST-based API 的地方是不需要构建 request 中的全部内容,提供了优雅的格式化的输出。rabbitmqadmin 已经实现了对 REST API 的封装,提供了更加简洁的调用接口,能够对 rabbitmq server 进行管理和监控。rabbitmqadmin 提供了 Web UI 上所具有的全部功能,且更易于在脚本中使用。rabbitmqadmin 是一个特化的 HTTP 客户端,但如果你打算在自己的应用程序中调用 rabbitmqadmin ,那么还是建议你采用直接访问 HTTP API 的方式.另外rabbitmqadmin一般会在增加可执行权限后放到/opt/rabbitmq-3.4.2/sbin中.

 

 

 

 

  • 大小: 37.9 KB
  • 大小: 10.3 KB
分享到:
评论

相关推荐

    shell脚本监控rabbitmq异常发送邮件通知.rar

    标题"shell脚本监控rabbitmq异常发送邮件通知.rar"表明这个压缩包包含了一个用Shell编写的脚本,其主要功能是对RabbitMQ集群进行健康检查,并在发现异常时通过邮件通知管理员。这对于及时发现和解决问题至关重要,...

    RabbitMQ自动安装脚本

    自动安装脚本是为了简化RabbitMQ在服务器上的部署过程,通常由bash或shell脚本编写,它可以自动处理下载、解压、配置、安装依赖和启动服务等一系列步骤。这样可以避免手动操作带来的繁琐和错误,提高效率。对于离线...

    rabbitmq 3.10.7 安装 shell脚本

    shell脚本安装rabbitmq 3.10.7

    rabbitmq快速安装自定义脚本

    该资源是自定义的脚本快速安装erlang19.3+rabbitmq3.6,将rabbitmq的安装配置、开机自启动等繁杂操作写成自定义脚本,rabbitmq安装位置:/usr/local/rabbitmq,erlang安装位置:/usr/local/erlang

    RabbitMQ流量控制机制分析1

    "RabbitMQ流量控制机制分析" RabbitMQ 的流量控制机制是指 RabbitMQ 为了避免接收消息的速率过快,导致消息队列过长,影响系统性能的机制。该机制主要通过三部分来实现:开关闸门、关闭闸门和开启闸门。 一、开关...

    openstack安装包(shell脚本配置文件)

    每个组件都有其特定的依赖和配置需求,shell脚本会自动处理这些复杂性,使得安装过程更加自动化。 在安装过程中,你还需要配置数据库服务,如MySQL或MongoDB,来存储OpenStack的各种元数据。此外,消息队列服务,如...

    rabbitmq部署脚本

    在本文中,我们将深入探讨RabbitMQ的部署过程,以及如何使用提供的“rabbitmq部署脚本.sh”来简化这一过程。 1. **AMQP协议理解**: AMQP是一种标准化的消息队列协议,它定义了消息的格式、路由规则和交互方式。...

    一键安装mysql,redis,nginx,rabbitmq脚本

    "一键安装mysql,redis,nginx,rabbitmq脚本" 提供了一种简便快捷的方式来部署这些常见的中间件服务,极大地节省了系统管理员的时间和精力。 首先,MySQL是一款开源的关系型数据库管理系统,广泛应用于Web应用中,它...

    rabbitmq-graphviz:使用graphviz显示RabbitMQ拓扑的脚本

    使用 graphviz 显示 RabbitMQ 拓扑的脚本,深受启发。 生成样本(目前只有一个): $ make samples 跑步: $ python rabbitmq_graphviz.py -d [DEFINITIONS_FILE] -o [DOT_FILE] 使用-p和-c标志分别呈现生产者...

    rabbitmq客户端

    RabbitMQ客户端是用于与RabbitMQ服务器交互的软件组件,它允许开发者在应用程序中发送和接收消息。RabbitMQ是一种开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,提供了高可用...

    Docker compose部署rabbitmq延迟队列(脚本下载)

    Docker compose部署rabbitmq延迟队列(脚本下载)

    Centos8 shell脚本自动化部署java、maven、mysql、nginx、redis、rabbitmq

    环境要求: 1.centos8版本 2.yum源畅通 3.将此压缩包放在/home/soft路径下 4.解压后chmod +x install.sh 5.使用 source install.sh执行此脚本

    centos7.9系统rabbitmq3.8.5升级为3.8.35版本

    创建RabbitMQ的启动脚本,并设置环境变量,例如: ```bash sudo vi /etc/init.d/rabbitmq-server ``` 然后,在脚本中添加启动、停止等命令。记得调整脚本中的路径以指向新版本的RabbitMQ。 接下来,创建RabbitMQ的...

    rabbitmq3.8.8.zip

    这可能是RabbitMQ服务器的解压目录或者包含RabbitMQ服务器安装脚本的文件夹。通常,这样的压缩包会包含启动脚本、配置文件、依赖库和可能的服务定义等。 结合这些信息,我们可以讨论RabbitMQ的一些关键知识点: 1....

    RabbitMQ-c源码

    **RabbitMQ-c源码分析** RabbitMQ-c是一个轻量级且高效的C语言实现的RabbitMQ客户端库。RabbitMQ是一个开源的消息代理和队列服务器,它使用AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中...

    rabbitmq配置文件 rabbitmq.config

    rabbitmq配置文件,用于rabbitmq管理

    RabbitMQ源码和客户端工具

    **RabbitMQ源码分析** RabbitMQ是一个开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中的异步处理、任务队列以及服务间通信。源码分析有助于深入理解其内部...

    rabbitMQ3.7.8windows安装软件包

    4. 检验Erlang是否安装成功,打开命令行窗口,输入`erl`,如果出现Erlang的shell界面,说明安装成功。 **二、RabbitMQ 3.7.8安装** 1. 访问RabbitMQ官方网站下载适合Windows的RabbitMQ Server 3.7.8版本。同样,...

    rabbitmq-3.7.28集群一键部署工具

    一键部署工具实现功能如下: 1、支持单节点部署 2、支持伪集群部署 3、支持分布式集群部署 ...5、支持创建、启动、停止、重启、检测...说明:工具使用非常简单,只需要修改变量文件,一分钟就可以快速帮你部署rabbitmq集群

    LinuxCentOS7版本RabbitMQ3.8.9带erlang+socat

    在 CentOS 7 中,RabbitMQ 的启动脚本可能需要手动添加到系统的初始化脚本中。你可以使用以下命令将 RabbitMQ 添加到服务列表: ```bash sudo cp兔mq-server/init.d/rabbitmq-server /etc/init.d/ sudo chkconfig -...

Global site tag (gtag.js) - Google Analytics