Я совершенно новичок как в .NET Core, так и в разработке демонов Linux. У меня было несколько похожих вопросов, таких как Изящное убийство Демон .NET Core, работающий в Linux или Изящное завершение работы с Generic Host в .NET Core 2.1, но они не решили мою проблему.
Я создал очень простое консольное приложение в качестве теста, используя размещенную службу. Я хочу, чтобы он работал как демон, но у меня проблемы с его корректным завершением. При запуске из консоли и в винде и в линуксе все работает нормально.
public static async Task Main(string[] args)
{
try
{
Console.WriteLine("Starting");
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DaemonService>();
});
System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 1");
await host.RunConsoleAsync();
System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 2");
}
finally
{
System.IO.File.WriteAllText("/path-to-app/_main-finally.txt", "Line 1");
}
}
public class DaemonService : IHostedService, IDisposable
{
public Task StartAsync(CancellationToken cancellationToken)
{
System.IO.File.WriteAllText("/path-to-app/_Start.txt", "Line 1");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
System.IO.File.WriteAllText("/path-to-app/_Stop.txt", "Line 1");
return Task.CompletedTask;
}
public void Dispose()
{
System.IO.File.WriteAllText("/path-to-app/_Dispose.txt", "Line 1");
}
}
Если я запускаю приложение из консоли, все работает как положено. Однако, когда он работает как демон, после выполнения kill <pid>
или systemctl stop <service>
выполняются методы StopAsync
и Dispose
, но больше ничего: ни in Main
после блока await
, ни finally
.
Примечание. Я не использую ничего из ASP.NET Core. AFAIK это не нужно для того, что я делаю.
Я делаю что-то неправильно? Это ожидаемое поведение?
IHostedService
используется вHostBuilder
, это то, что управляетSIGTERM
. После того, какTask
помечен как завершенный, он определяет, что служба корректно завершила работу. - person Tubs   schedule 23.04.2019WriteAllText
послеRunConsoleAsync
иfinally
внутрьStopAsync
, это может сработать? Сохраняйте условиеfinally
при перемещении - person Tubs   schedule 24.04.2019await
и блокаfinally
вDispose
, это сработает. Но я думаю, что все начинает становиться действительно запутанным. Я считаю, что не стоит сообщатьHostedService
, как завершить всю программу. - person Diego   schedule 24.04.2019Program.cs
и позволяя самой службе поддерживать свои зависимости. Мой совет состоял бы в том, чтобы содержать как можно больше в сервисе и просто инициализировать его с помощью методаMain
. - person Tubs   schedule 24.04.2019