"Ошибка System.IO.IOException: Failed to bind to address http://127.0.0.1:44837: address already in use."

У меня есть процесс net core в Linux, который в течение своей жизни запускает и закрывает другой процесс. «Основной» процесс передает адрес вспомогательному процессу для развертывания.

Вызов вспомогательного процесса выглядит так: Main.cs

ProcessStartInfo startInfo = new ProcessStartInfo
{
  FileName = "dotnet",
  UseShellExecute = false,
  Arguments = Path.Join(*pathTo.dll*) + " " + args;
}
return Process.Start(startInfo).Id;

где args содержит IP-адрес типа http://localhost:44837/ и другие аргументы.

Вторичный процесс имеет следующую структуру Program.cs

public static IHostBuilder CreateHostBuilder(string[] args)
{
(...)
 return Host.CreateDefaultBuilder(args)
                .UseNLog()
                .ConfigureServices((hostContext, services) =>
                {
                   (..)
                })
                .ConfigureAppConfiguration((context, configurationBuilder) =>
                {
                  (..)
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .UseStartup<Startup>()
                        .UseConfiguration(configuration);
                        .UseUrls(myArgs(тут я задаю свой http://localhost:44837/)));
                });
(...)

Основной процесс запускает потомка, потомок разворачивается на желаемом порте, но потом выпадает ошибка:

nfo: Microsoft.Hosting.Lifetime[0]
  Now listening on: http://localhost:44837

info: Microsoft.Hosting.Lifetime[0]
  Application started. Press Ctrl+C to shut down.

info: Microsoft.Hosting.Lifetime[0]

      Hosting environment: Production

info: Microsoft.Hosting.Lifetime[0]

Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://127.0.0.1:44837: address already in use.
 ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use
 ---> System.Net.Sockets.SocketException (98): Address already in use
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)

В интернете нашел 2 решения. Либо убить мешающий процесс, либо установить свободный порт в UseUrls.

Но в первом случае мне нужно сохранить оба процесса, а во втором я уже устанавливаю свободный порт в UseUrls.

На Windows запуск процесса немного другой, но структура IHostBuilder CreateHostBuilder та же и всё отрабатывает. А как быть с линуксом?


Ответы (0 шт):