Merge pull request #7282 from zmstone/build-refine-systemd-service-unit
Start EMQX in foreground mode in systemd
This commit is contained in:
commit
acd9aaff4d
|
@ -544,6 +544,7 @@ log {
|
||||||
##----------------------------------------------------------------
|
##----------------------------------------------------------------
|
||||||
## file_handlers.<name>
|
## file_handlers.<name>
|
||||||
file_handlers.default {
|
file_handlers.default {
|
||||||
|
enable = true
|
||||||
## The log level filter of this handler
|
## The log level filter of this handler
|
||||||
## All the log messages with levels lower than this level will
|
## All the log messages with levels lower than this level will
|
||||||
## be dropped.
|
## be dropped.
|
||||||
|
|
|
@ -586,11 +586,7 @@ fields("log") ->
|
||||||
];
|
];
|
||||||
|
|
||||||
fields("console_handler") ->
|
fields("console_handler") ->
|
||||||
[ {"enable",
|
log_handler_common_confs();
|
||||||
sc(boolean(),
|
|
||||||
#{ default => false
|
|
||||||
})}
|
|
||||||
] ++ log_handler_common_confs();
|
|
||||||
|
|
||||||
fields("log_file_handler") ->
|
fields("log_file_handler") ->
|
||||||
[ {"file",
|
[ {"file",
|
||||||
|
@ -704,13 +700,21 @@ tr_cluster_discovery(Conf) ->
|
||||||
tr_logger_level(Conf) ->
|
tr_logger_level(Conf) ->
|
||||||
ConsoleLevel = conf_get("log.console_handler.level", Conf, undefined),
|
ConsoleLevel = conf_get("log.console_handler.level", Conf, undefined),
|
||||||
FileLevels = [conf_get("level", SubConf) || {_, SubConf}
|
FileLevels = [conf_get("level", SubConf) || {_, SubConf}
|
||||||
<- maps:to_list(conf_get("log.file_handlers", Conf, #{}))],
|
<- logger_file_handlers(Conf)],
|
||||||
case FileLevels ++ [ConsoleLevel || ConsoleLevel =/= undefined] of
|
case FileLevels ++ [ConsoleLevel || ConsoleLevel =/= undefined] of
|
||||||
[] -> warning; %% warning is the default level we should use
|
[] -> warning; %% warning is the default level we should use
|
||||||
Levels ->
|
Levels ->
|
||||||
least_severe_log_level(Levels)
|
least_severe_log_level(Levels)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
logger_file_handlers(Conf) ->
|
||||||
|
Handlers = maps:to_list(conf_get("log.file_handlers", Conf, #{})),
|
||||||
|
lists:filter(fun({_Name, Opts}) ->
|
||||||
|
B = conf_get("enable", Opts),
|
||||||
|
true = is_boolean(B),
|
||||||
|
B
|
||||||
|
end, Handlers).
|
||||||
|
|
||||||
tr_logger(Conf) ->
|
tr_logger(Conf) ->
|
||||||
%% For the default logger that outputs to console
|
%% For the default logger that outputs to console
|
||||||
ConsoleHandler =
|
ConsoleHandler =
|
||||||
|
@ -743,12 +747,15 @@ tr_logger(Conf) ->
|
||||||
filters => log_filter(SubConf),
|
filters => log_filter(SubConf),
|
||||||
filesync_repeat_interval => no_repeat
|
filesync_repeat_interval => no_repeat
|
||||||
}}
|
}}
|
||||||
end || {HandlerName, SubConf} <- maps:to_list(conf_get("log.file_handlers", Conf, #{}))],
|
end || {HandlerName, SubConf} <- logger_file_handlers(Conf)],
|
||||||
|
|
||||||
[{handler, default, undefined}] ++ ConsoleHandler ++ FileHandlers.
|
[{handler, default, undefined}] ++ ConsoleHandler ++ FileHandlers.
|
||||||
|
|
||||||
log_handler_common_confs() ->
|
log_handler_common_confs() ->
|
||||||
[ {"level",
|
[ {"enable",
|
||||||
|
sc(boolean(),
|
||||||
|
#{ default => false
|
||||||
|
})}
|
||||||
|
, {"level",
|
||||||
sc(log_level(),
|
sc(log_level(),
|
||||||
#{ default => warning
|
#{ default => warning
|
||||||
, desc => "Global log level. This includes the primary log level "
|
, desc => "Global log level. This includes the primary log level "
|
||||||
|
|
53
bin/emqx
53
bin/emqx
|
@ -540,6 +540,48 @@ latest_vm_args() {
|
||||||
fi
|
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)
|
## IS_BOOT_COMMAND is set for later to inspect node name and cookie from hocon config (or env variable)
|
||||||
case "${COMMAND}" in
|
case "${COMMAND}" in
|
||||||
start|console|console_clean|foreground)
|
start|console|console_clean|foreground)
|
||||||
|
@ -621,7 +663,7 @@ case "${COMMAND}" in
|
||||||
|
|
||||||
# this flag passes down to console mode
|
# this flag passes down to console mode
|
||||||
# so we know it's intended to be run in daemon 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
|
case "$COMMAND" in
|
||||||
start)
|
start)
|
||||||
|
@ -764,8 +806,10 @@ case "${COMMAND}" in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# set before generate_config
|
# set before generate_config
|
||||||
if [ "${_EMQX_START_MODE:-}" = '' ]; then
|
if [ "${_EMQX_START_DAEMON_MODE:-}" = 1 ]; then
|
||||||
export EMQX_LOG__CONSOLE_HANDLER__ENABLE="${EMQX_LOG__CONSOLE_HANDLER__ENABLE:-true}"
|
tr_log_to_env
|
||||||
|
else
|
||||||
|
maybe_log_to_console
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#generate app.config and vm.args
|
#generate app.config and vm.args
|
||||||
|
@ -815,8 +859,7 @@ case "${COMMAND}" in
|
||||||
# start up the release in the foreground for use by runit
|
# start up the release in the foreground for use by runit
|
||||||
# or other supervision services
|
# or other supervision services
|
||||||
|
|
||||||
# set before generate_config
|
maybe_log_to_console
|
||||||
export EMQX_LOG__CONSOLE_HANDLER__ENABLE="${EMQX_LOG__CONSOLE_HANDLER__ENABLE:-true}"
|
|
||||||
|
|
||||||
#generate app.config and vm.args
|
#generate app.config and vm.args
|
||||||
generate_config "$NAME_TYPE" "$NAME"
|
generate_config "$NAME_TYPE" "$NAME"
|
||||||
|
|
|
@ -5,13 +5,34 @@ After=network.target
|
||||||
[Service]
|
[Service]
|
||||||
User=emqx
|
User=emqx
|
||||||
Group=emqx
|
Group=emqx
|
||||||
Type=forking
|
|
||||||
|
# The ExecStart= is foreground, so 'simple' here
|
||||||
|
Type=simple
|
||||||
Environment=HOME=/var/lib/emqx
|
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
|
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
|
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]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=emqx daemon
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=emqx
|
|
||||||
Group=emqx
|
|
||||||
Type=forking
|
|
||||||
Environment=HOME=/var/lib/emqx
|
|
||||||
ExecStart=/usr/bin/emqx start
|
|
||||||
LimitNOFILE=1048576
|
|
||||||
ExecStop=/usr/bin/emqx stop
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5s
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
|
@ -0,0 +1 @@
|
||||||
|
../emqx.service
|
Loading…
Reference in New Issue