diff options
| author | Dan Engelbrecht <[email protected]> | 2024-08-27 17:07:11 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-08-27 17:07:11 +0200 |
| commit | ba16864865dbbb3f69783d210b4f07f599906a73 (patch) | |
| tree | 17efb792f14f5fc8df7831593ab4d764e6617193 /src/zen/cmds/up_cmd.cpp | |
| parent | Make sure `noexcept` functions does not leak exceptions (#136) (diff) | |
| download | archived-zen-ba16864865dbbb3f69783d210b4f07f599906a73.tar.xz archived-zen-ba16864865dbbb3f69783d210b4f07f599906a73.zip | |
zenserver process launch/termination improvements (#138)
* zenserver process launch/termination improvements
* fix GetPidStatus to return error code on Linux
* fix linux FindProcess()
* cleanup IsZombieProcess
Diffstat (limited to 'src/zen/cmds/up_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/up_cmd.cpp | 80 |
1 files changed, 62 insertions, 18 deletions
diff --git a/src/zen/cmds/up_cmd.cpp b/src/zen/cmds/up_cmd.cpp index 5344a078d..c65dc5d5a 100644 --- a/src/zen/cmds/up_cmd.cpp +++ b/src/zen/cmds/up_cmd.cpp @@ -17,13 +17,15 @@ namespace zen { UpCommand::UpCommand() { m_Options.add_option("", "p", "port", "Host port", cxxopts::value(m_Port)->default_value("0"), "<hostport>"); - m_Options.add_option("lifetime", - "", - "owner-pid", - "Specify owning process id", - cxxopts::value(m_OwnerPid)->default_value("0"), - "<identifier>"); m_Options.add_option("", "b", "base-dir", "Parent folder of server executable", cxxopts::value(m_ProgramBaseDir), "<directory>"); + m_Options + .add_option("", "c", "show-console", "Open a console window for the zenserver process", cxxopts::value(m_ShowConsole), "<console>"); + m_Options.add_option("", + "l", + "show-log", + "Show the output log of the zenserver process after successful start", + cxxopts::value(m_ShowLog), + "<showlog>"); } UpCommand::~UpCommand() = default; @@ -31,6 +33,8 @@ UpCommand::~UpCommand() = default; int UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { + using namespace std::literals; + ZEN_UNUSED(GlobalOptions); if (!ParseOptions(argc, argv)) @@ -38,6 +42,11 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) return 0; } + if (m_ShowConsole && m_ShowLog) + { + throw OptionParseException("--show-console can not be used in combination with --show-log"); + } + { ZenServerState State; if (State.InitializeReadOnly()) @@ -76,11 +85,12 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ZenServerEnvironment ServerEnvironment; ServerEnvironment.Initialize(m_ProgramBaseDir); ZenServerInstance Server(ServerEnvironment); - if (m_OwnerPid != 0) + std::string ServerArguments = GlobalOptions.PassthroughCommandLine; + if ((m_Port != 0) && (ServerArguments.find("--port"sv) == std::string::npos)) { - Server.SetOwnerPid(m_OwnerPid); + ServerArguments.append(fmt::format(" --port {}", m_Port)); } - Server.SpawnServer(m_Port, GlobalOptions.PassthroughCommandLine); + Server.SpawnServer(ServerArguments, m_ShowConsole, /*WaitTimeoutMs*/ 0); int Timeout = 10000; @@ -90,15 +100,29 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_ERROR("zen server launch failed (timed out), terminating"); Server.Terminate(); + if (!m_ShowConsole) + { + ZEN_CONSOLE("{}", Server.GetLogOutput()); + } return 111; } int ReturnCode = Server.Shutdown(); - ZEN_CONSOLE("{}", Server.GetLogOutput()); + if (!m_ShowConsole) + { + ZEN_CONSOLE("{}", Server.GetLogOutput()); + } return ReturnCode; } else { - ZEN_CONSOLE("zen server up"); + if (m_ShowLog) + { + ZEN_CONSOLE("{}", Server.GetLogOutput()); + } + else + { + ZEN_CONSOLE("zen server up"); + } } return 0; } @@ -225,11 +249,30 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ZEN_CONSOLE("attached to server on port {} (pid {}), requesting shutdown", EntryPort, ServerProcessPid); - Server.Shutdown(); - - ZEN_CONSOLE("shutdown complete"); - - return 0; + std::error_code Ec; + if (Server.SignalShutdown(Ec) && !Ec) + { + Stopwatch Timer; + while (Timer.GetElapsedTimeMs() < 10000) + { + if (Server.WaitUntilExited(100, Ec) && !Ec) + { + ZEN_CONSOLE("shutdown complete"); + return 0; + } + else if (Ec) + { + ZEN_CONSOLE("Waiting for server on port {} (pid {}) failed. Reason: '{}'", + EntryPort, + ServerProcessPid, + Ec.message()); + } + } + } + else if (Ec) + { + ZEN_CONSOLE("requesting shutdown of server on port {} failed. Reason: '{}'", EntryPort, Ec.message()); + } } catch (const std::exception& Ex) { @@ -240,11 +283,11 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) // handle to determine when the server has shut down. Thus we signal that we would like // a shutdown via the shutdown flag and the check if the entry is still running. - ZEN_CONSOLE("requesting shutdown of server on port {}", EntryPort); + ZEN_CONSOLE("requesting detached shutdown of server on port {}", EntryPort); Entry->SignalShutdownRequest(); Stopwatch Timer; - while (Timer.GetElapsedTimeMs() < 5000) + while (Timer.GetElapsedTimeMs() < 10000) { Instance.Sweep(); Entry = Instance.Lookup(EntryPort); @@ -261,6 +304,7 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) Sleep(100); } } + if (m_ForceTerminate) { // Try to find the running executable by path name |