diff --git a/bin/emqx b/bin/emqx index 7e1f2dd12..1cfc36481 100755 --- a/bin/emqx +++ b/bin/emqx @@ -540,6 +540,48 @@ latest_vm_args() { fi } +# backward compabible with 4.x +tr_log_to_env() { + local log_to=${EMQX_LOG__TO:-undefined} + # unset because it's unknown to 5.0 + unset EMQX_LOG__TO + case "${log_to}" in + console) + export EMQX_LOG__CONSOLE_HANDLER__ENABLE='true' + export EMQX_LOG__FILE_HANDLERS__DEFAULT__ENABLE='false' + ;; + file) + export EMQX_LOG__CONSOLE_HANDLER__ENABLE='false' + export EMQX_LOG__FILE_HANDLERS__DEFAULT__ENABLE='true' + ;; + both) + export EMQX_LOG__CONSOLE_HANDLER__ENABLE='true' + export EMQX_LOG__FILE_HANDLERS__DEFAULT__ENABLE='true' + ;; + default) + # want to use config file defaults, do nothing + ;; + undefined) + # value not set, do nothing + ;; + *) + echoerr "Unknown environment value for EMQX_LOG__TO=${log_to} discarded" + ;; + esac +} + +maybe_log_to_console() { + if [ "${EMQX_LOG__TO:-}" = 'default' ]; then + # want to use config file defaults, do nothing + unset EMQX_LOG__TO + else + tr_log_to_env + # ensure defaults + export EMQX_LOG__CONSOLE_HANDLER__ENABLE="${EMQX_LOG__CONSOLE_HANDLER__ENABLE:-true}" + export EMQX_LOG__FILE_HANDLERS__DEFAULT__ENABLE="${EMQX_LOG__FILE_HANDLERS__DEFAULT__ENABLE:-false}" + fi +} + ## IS_BOOT_COMMAND is set for later to inspect node name and cookie from hocon config (or env variable) case "${COMMAND}" in start|console|console_clean|foreground) @@ -621,7 +663,7 @@ case "${COMMAND}" in # this flag passes down to console mode # so we know it's intended to be run in daemon mode - export _EMQX_START_MODE="$COMMAND" + export _EMQX_START_DAEMON_MODE=1 case "$COMMAND" in start) @@ -764,8 +806,10 @@ case "${COMMAND}" in esac # set before generate_config - if [ "${_EMQX_START_MODE:-}" = '' ]; then - export EMQX_LOG__CONSOLE_HANDLER__ENABLE="${EMQX_LOG__CONSOLE_HANDLER__ENABLE:-true}" + if [ "${_EMQX_START_DAEMON_MODE:-}" = 1 ]; then + tr_log_to_env + else + maybe_log_to_console fi #generate app.config and vm.args @@ -815,8 +859,7 @@ case "${COMMAND}" in # start up the release in the foreground for use by runit # or other supervision services - # set before generate_config - export EMQX_LOG__CONSOLE_HANDLER__ENABLE="${EMQX_LOG__CONSOLE_HANDLER__ENABLE:-true}" + maybe_log_to_console #generate app.config and vm.args generate_config "$NAME_TYPE" "$NAME" diff --git a/deploy/packages/emqx.service b/deploy/packages/emqx.service index ef9abfb01..29877674e 100644 --- a/deploy/packages/emqx.service +++ b/deploy/packages/emqx.service @@ -5,13 +5,34 @@ After=network.target [Service] User=emqx Group=emqx -Type=forking + +# The ExecStart= is foreground, so 'simple' here +Type=simple Environment=HOME=/var/lib/emqx -ExecStart=/usr/bin/emqx start + +# Enable logging to file +Environment=EMQX_LOG__TO=default + +# Start 'foregroun' but not 'start' (daemon) mode. +# Because systemd monitor/restarts 'simple' services +ExecStart=/usr/bin/emqx foreground + +# Give EMQX enough file descriptors LimitNOFILE=1048576 -ExecStop=/usr/bin/emqx stop + +# ExecStop is commented out so systemd will send a SIGTERM when 'systemctl stop'. +# SIGTERM is handled by EMQX and it then performs a graceful shutdown +# It's better than command 'emqx stop' because it needs to ping the node +# ExecStop=/usr/bin/emqx stop + +# Wait long enough before force kill for graceful shutdown +TimeoutStopSec=120s + Restart=on-failure -RestartSec=5s + +# Do not restart immediately so the peer nodes in the cluster have +# enough time to handle the 'DOWN' events of this node +RestartSec=120s [Install] WantedBy=multi-user.target