protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogDebug("Using configuration from " + _options.Source); _logger.LogDebug("Configure echo service for " + _options.IPAddress); _echoTcpServer = new EchoTcpServer(IPAddress.Parse(_options.IPAddress), _options.Port, _logger); _echoUdpServer = new EchoUdpServer(IPAddress.Parse(_options.IPAddress), _options.Port, _logger); if (_echoTcpServer.Start()) { _logger.LogInformation("Echo TCP Server started."); } else { _logger.LogCritical("Starting Echo TCP Server failed."); Environment.Exit(1); } if (_echoUdpServer.Start()) { _logger.LogInformation("Echo UDP Server started."); } else { _logger.LogCritical("Starting Echo UDP Server failed."); Environment.Exit(1); } Unix.DropRoot(_options.User, _logger); _logger.LogInformation("EchoSevenService initialized at: {time}", DateTimeOffset.Now); while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("EchoSevenService heartbeat at: {time}", DateTimeOffset.Now); await Task.Delay(30000, stoppingToken); } if (_echoUdpServer.Stop()) { _logger.LogInformation("Echo UDP Server stopped successfully."); } else { _logger.LogError("Error stopping Echo UDP Server."); } if (_echoTcpServer.Stop()) { _logger.LogInformation("Echo TCP Server stopped successfully."); } else { _logger.LogError("Error stopping Echo TCP Server."); } }