summaryrefslogtreecommitdiff
path: root/deps/rabbit/scripts/rabbitmq-server
diff options
context:
space:
mode:
Diffstat (limited to 'deps/rabbit/scripts/rabbitmq-server')
-rwxr-xr-xdeps/rabbit/scripts/rabbitmq-server155
1 files changed, 155 insertions, 0 deletions
diff --git a/deps/rabbit/scripts/rabbitmq-server b/deps/rabbit/scripts/rabbitmq-server
new file mode 100755
index 0000000000..82058dcb26
--- /dev/null
+++ b/deps/rabbit/scripts/rabbitmq-server
@@ -0,0 +1,155 @@
+#!/bin/sh
+# vim:sw=4:et:
+## This Source Code Form is subject to the terms of the Mozilla Public
+## License, v. 2.0. If a copy of the MPL was not distributed with this
+## file, You can obtain one at https://mozilla.org/MPL/2.0/.
+##
+## Copyright (c) 2007-2020 VMware, Inc. or its affiliates. All rights reserved.
+##
+
+set -e
+
+# Get default settings with user overrides for (RABBITMQ_)<var_name>
+# Non-empty defaults should be set in rabbitmq-env
+SCRIPTS_DIR=$(dirname "$0")
+. "$SCRIPTS_DIR/rabbitmq-env"
+
+[ "$NOTIFY_SOCKET" ] && RUNNING_UNDER_SYSTEMD=true
+
+RABBITMQ_DEFAULT_ALLOC_ARGS="+MBas ageffcbf +MHas ageffcbf +MBlmbcs 512 +MHlmbcs 512 +MMmcs 30"
+
+# Bump ETS table limit to 50000
+if [ "x" = "x$ERL_MAX_ETS_TABLES" ]; then
+ ERL_MAX_ETS_TABLES=50000
+fi
+
+check_start_params() {
+ check_not_empty RABBITMQ_BOOT_MODULE
+ check_not_empty SASL_BOOT_FILE
+}
+
+check_not_empty() {
+ local name="${1:?}"
+ local value
+ eval value=\$$name
+ if [ -z "$value" ]; then
+ echo "Error: ENV variable should be defined: $1.
+ Please check rabbitmq-env, rabbitmq-defaults, and ${RABBITMQ_CONF_ENV_FILE} script files"
+ exit 78
+ fi
+}
+
+start_rabbitmq_server() {
+ set -e
+
+ _rmq_env_set_erl_libs
+
+ RABBITMQ_START_RABBIT=
+ [ "x" = "x$RABBITMQ_ALLOW_INPUT" ] && RABBITMQ_START_RABBIT=" -noinput"
+ if test -z "$RABBITMQ_NODE_ONLY"; then
+ if test "$USE_RABBIT_BOOT_SCRIPT"; then
+ # TODO: This is experimental and undocumented at this point.
+ # It is here just to do simple checks while playing with how
+ # RabbitMQ is started.
+ "$SCRIPTS_DIR/rabbitmq-rel" gen-boot
+ SASL_BOOT_FILE=rabbit
+ test -f "$SASL_BOOT_FILE.boot"
+ RABBITMQ_START_RABBIT="$RABBITMQ_START_RABBIT -init_debug"
+ else
+ RABBITMQ_START_RABBIT="$RABBITMQ_START_RABBIT -s $RABBITMQ_BOOT_MODULE boot"
+ fi
+ fi
+
+ # 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
+
+ export ERL_MAX_ETS_TABLES \
+ SYS_PREFIX
+
+ check_start_params
+
+ exec erl \
+ -pa "$RABBITMQ_SERVER_CODE_PATH" \
+ ${RABBITMQ_START_RABBIT} \
+ -boot "${SASL_BOOT_FILE}" \
+ +W w \
+ ${RABBITMQ_DEFAULT_ALLOC_ARGS} \
+ ${RABBITMQ_SERVER_ERL_ARGS} \
+ ${RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS} \
+ ${RABBITMQ_SERVER_START_ARGS} \
+ -lager crash_log false \
+ -lager handlers '[]' \
+ "$@"
+}
+
+stop_rabbitmq_server() {
+ if test "$rabbitmq_server_pid"; then
+ kill -TERM "$rabbitmq_server_pid"
+ wait "$rabbitmq_server_pid" || true
+ fi
+}
+
+if [ "$RABBITMQ_ALLOW_INPUT" -o "$RUNNING_UNDER_SYSTEMD" -o "$detached" ]; then
+ # Run erlang VM directly, completely replacing current shell
+ # process - so the pid file written in the code above will be
+ # valid (unless detached, which is also handled in the code
+ # above).
+ #
+ # And also this is the correct mode to run the broker under
+ # systemd - there is no need in a proxy process that converts
+ # signals to graceful shutdown command, the unit file should already
+ # contain instructions for graceful shutdown. Also by removing
+ # this additional process we could simply use value returned by
+ # `os:getpid/0` for a systemd ready notification.
+ start_rabbitmq_server "$@"
+else
+ # When RabbitMQ runs in the foreground but the Erlang shell is
+ # disabled, we setup signal handlers to stop RabbitMQ properly. This
+ # is at least useful in the case of Docker.
+ # The Erlang VM should ignore SIGINT.
+ RABBITMQ_SERVER_START_ARGS="${RABBITMQ_SERVER_START_ARGS} ${RABBITMQ_IGNORE_SIGINT_FLAG}"
+
+ # Signal handlers. They all stop RabbitMQ properly, using
+ # rabbitmqctl stop. This script will exit with different exit codes:
+ # SIGHUP, SIGTSTP + SIGCONT
+ # Ignored until we implement a useful behavior.
+ # SIGTERM
+ # Exits 0 since this is considered a normal process termination.
+ # SIGINT
+ # Exits 128 + $signal_number where $signal_number is 2 for SIGINT (see
+ # https://pubs.opengroup.org/onlinepubs/009695399/utilities/kill.html).
+ # This is considered an abnormal process termination. Normally, we
+ # don't need to specify this exit code because the shell propagates it.
+ # Unfortunately, the signal handler doesn't work as expected in Dash,
+ # thus we need to explicitly restate the exit code.
+ #
+ # The behaviors below should remain consistent with the
+ # equivalent signal handlers in the Erlang code
+ # (see apps/rabbitmq_prelaunch/src/rabbit_prelaunch_sighandler.erl).
+ trap '' HUP TSTP CONT
+ trap "stop_rabbitmq_server; exit 0" TERM
+ trap "stop_rabbitmq_server; exit 130" INT
+
+ start_rabbitmq_server "$@" &
+ export rabbitmq_server_pid=$!
+
+ # Block until RabbitMQ exits or a signal is caught.
+ # Waits for last command (which is start_rabbitmq_server)
+ #
+ # The "|| true" is here to work around an issue with Dash. Normally
+ # in a Bourne shell, if `wait` is interrupted by a signal, the
+ # signal handlers defined above are executed and the script
+ # terminates with the exit code of `wait` (unless the signal handler
+ # overrides that).
+ # In the case of Dash, it looks like `set -e` (set at the beginning
+ # of this script) gets precedence over signal handling. Therefore,
+ # when `wait` is interrupted, its exit code is non-zero and because
+ # of `set -e`, the script terminates immediately without running the
+ # signal handler. To work around this issue, we use "|| true" to
+ # force that statement to succeed and the signal handler to properly
+ # execute. Because the statement below has an exit code of 0, the
+ # signal handler has to restate the expected exit code.
+ wait "$rabbitmq_server_pid" || true
+fi