From: Alexander A. Klimov Date: Mon, 5 Aug 2019 16:30:45 +0000 (+0200) Subject: icinga2 daemon --close-stdio: keep console log open during first config validation X-Git-Tag: v2.11.0~1^2~46^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6418c2ebb74e8e8f9e73a5576e43cff5e66cc20e;p=icinga2 icinga2 daemon --close-stdio: keep console log open during first config validation refs #7394 --- diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 8091c403e..4975536ac 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -193,11 +193,13 @@ static Atomic l_AllowedToWork (false); * Do the actual work (config loading, ...) * * @param configs Files to read config from + * @param closeConsoleLog Whether to close the console log after config loading + * @param stderrFile Where to log errors * * @return Exit code */ static inline -int RunWorker(const std::vector& configs) +int RunWorker(const std::vector& configs, bool closeConsoleLog = false, const String& stderrFile = String()) { Log(LogInformation, "cli", "Loading configuration file(s)."); @@ -216,6 +218,11 @@ int RunWorker(const std::vector& configs) Log(LogNotice, "cli") << "Waiting for the umbrella process to let us doing the actual work"; + if (closeConsoleLog) { + CloseStdIO(stderrFile); + Logger::DisableConsoleLog(); + } + while (!l_AllowedToWork.load()) { Utility::Sleep(0.2); } @@ -397,10 +404,12 @@ static void NotifyWatchdog() * Starts seemless worker process doing the actual work (config loading, ...) * * @param configs Files to read config from + * @param closeConsoleLog Whether to close the console log after config loading + * @param stderrFile Where to log errors * * @return The worker's PID on success, -1 on failure (if the worker couldn't load its config) */ -static pid_t StartUnixWorker(const std::vector& configs) +static pid_t StartUnixWorker(const std::vector& configs, bool closeConsoleLog = false, const String& stderrFile = String()) { Log(LogNotice, "cli") << "Spawning seemless worker process doing the actual work"; @@ -461,7 +470,7 @@ static pid_t StartUnixWorker(const std::vector& configs) _exit(EXIT_FAILURE); } - _exit(RunWorker(configs)); + _exit(RunWorker(configs, closeConsoleLog, stderrFile)); } catch (...) { _exit(EXIT_FAILURE); } @@ -604,7 +613,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector(); + // The PID of the current seemless worker - pid_t currentWorker = StartUnixWorker(configs); + pid_t currentWorker = StartUnixWorker(configs, closeConsoleLog, errorLog); if (currentWorker == -1) { return EXIT_FAILURE; } + if (closeConsoleLog) { + // After disabling the console log, any further errors will go to the configured log only. + // Let's try to make this clear and say good bye. + Log(LogInformation, "cli", "Closing console log."); + + CloseStdIO(errorLog); + Logger::DisableConsoleLog(); + } + // Immediately allow the first (non-reload) worker to continue working beyond config validation (void)kill(currentWorker, SIGUSR2);