diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 8091c403e..a9619c34a 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -193,19 +193,23 @@ 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)."); { std::vector newItems; - if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath)) + if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath)) { + Log(LogCritical, "cli", "Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config."); return EXIT_FAILURE; + } #ifndef _WIN32 Log(LogNotice, "cli") @@ -216,6 +220,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 +406,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 +472,7 @@ static pid_t StartUnixWorker(const std::vector& configs) _exit(EXIT_FAILURE); } - _exit(RunWorker(configs)); + _exit(RunWorker(configs, closeConsoleLog, stderrFile)); } catch (...) { _exit(EXIT_FAILURE); } @@ -562,8 +573,10 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector newItems; - if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath)) + if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath)) { + Log(LogCritical, "cli", "Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config."); return EXIT_FAILURE; + } Log(LogInformation, "cli", "Finished validating the configuration file(s)."); return EXIT_SUCCESS; @@ -604,7 +617,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);