/// <inheritdoc /> public async Task <BoolResult> ShutdownAsync(Context context) { ShutdownStarted = true; context.Debug($"Stopping service process {_process.Id} for scenario {_scenario}"); await Task.Run(() => { IpcUtilities.SetShutdown(_scenario); if (!_process.WaitForExit(_waitForExitTimeoutMs)) { context.Warning("Service process failed to exit, killing hard"); try { _process.Kill(); } catch (InvalidOperationException) { // the process may have exited, // in this case ignore the exception } } }); ShutdownCompleted = true; if (_process.ExitCode.HasValue && (_process.ExitCode != 0 || _process.GetStdErr().Length != 0)) { return(new BoolResult($"Process exited with code {_process.ExitCode}. Command line args: {_args}. StdErr: {_process.GetStdErr()} StdOut: {_process.GetStdOut()}")); } return(BoolResult.Success); }