2016-07-10 27 views
20

Stworzyłem aplikację konsoli .NET Core działającą jako demon na komputerze z Ubuntu 14.04.Bezpieczne zabijanie demona .NET Core działającego pod Linuksem

Chcę zatrzymać usługę bez wymuszania jej, mogąc obsłużyć zdarzenie kill.

Jak mogę to osiągnąć?

+4

Zadbaj o udostępnienie swojego kodu - zamień aplikację konsoli .NET Core w demona Ubuntu? – lasseschou

+3

Jedyne co zrobiłem to skopiowanie domyślnego skryptu init z GitHub; funkcja startowa wywołuje 'dotnet library.dll' i stop" kill compotnet library.dll ". – user4388177

Odpowiedz

19

Chcesz być w stanie wysłać SIGTERM do uruchomionego procesu:

kill <PID> 

I proces ten powinien obsługiwać go do zamykania poprawnie.

Niestety NET Rdzeń nie jest dobrze udokumentowana, ale jest zdolny do przenoszenia sygnałów owych (w inny sposób z mono). GitHub issue

Jeśli używasz Ubuntu z dorobkiewicz, co potrzebne jest, aby mieć skrypt startowy, który wysyła do kill sygnał na żądanie zatrzymania: Example init script

dodać zależność do projektu .json:

"System.Runtime.Loader": "4.0.0" 

To daje AssemblyLoadContext.

Następnie można obsłużyć zdarzenia SIGTERM:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm; 

UWAGA:

Korzystanie mono, poprawny sposób postępowania byłoby przez UnixSignal: Mono.Unix.Native.Signum .SIGTERM

+0

Działa to, jeśli aplikacja zatrzymuje się sama z wdziękiem. Ale jeśli polecenie kill zostanie wywołane, nie wywoła "AssemblyLoadContext.Default.Unloading". czy robię coś źle? – dcinadr

+0

Jakiej wersji .NET Core używasz? Czy modyfikujesz kontekst ładowania w pewnym momencie? –

+0

Wersja: 1.0.0-preview2-003121 ... Zauważyłem też, że po uruchomieniu "dotnet run" uruchamia 2 procesy. Myślę, że to jest powód, dla którego nie działa, ponieważ zabija jeden z procesów, ale nie oba. – dcinadr

9

. NET Core znacznie ewoluował od czasu odpowiedzi Stefano'a rok temu. W .NET Core 2.0 można teraz używać znanego zdarzenia AppDomain.CurrentDomain.ProcessExit zamiast AssemblyLoadContext.Default.Unloading. Działa dobrze dla aplikacji konsolowych na Linuksie, także w Dockerze.

Powiązane problemy