web-dev-qa-db-fra.com

Tuer gracieusement un démon .NET Core fonctionnant sous Linux

J'ai créé une application console .NET Core fonctionnant en tant que démon sur une machine Ubuntu 14.04.

Je veux arrêter le service sans le forcer, en étant capable de gérer un événement kill.

Comment puis-je atteindre cet objectif?

29
user4388177

Vous voulez pouvoir envoyer un [~ # ~] sigterm [~ # ~] au processus en cours:

kill <PID>

Et le processus doit gérer correctement l'arrêt.

Malheureusement . NET Core n'est pas bien documenté, mais il est capable de gérer les signaux Unix (d'une manière différente de Mono ). problème GitHub

Si vous utilisez Ubuntu avec Upstart , ce dont vous avez besoin est d'avoir un script init qui envoie le signal kill sur une demande d'arrêt: Exemple de script init

Ajoutez une dépendance à votre project.json :

"System.Runtime.Loader": "4.0.0"

Cela vous donnera le AssemblyLoadContext .

Ensuite, vous pouvez gérer l'événement SIGTERM:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;

Remarque:

En utilisant Mono, la manière correcte de le gérer serait via le UnixSignal : Mono.Unix.Native.Signum. SIGTERM

MODIFIER:

Comme @Marc l'a souligné dans sa récente réponse, ce n'est plus le meilleur moyen d'y parvenir. De . NET Core 2.0AppDomain.CurrentDomain.ProcessExit est l'événement pris en charge.

26
Stefano d'Antonio

.NET Core a considérablement évolué depuis la réponse de @ Stefano il y a un an. Dans .NET Core 2.0, vous pouvez désormais utiliser le célèbre AppDomain.CurrentDomain.ProcessExit événement au lieu de AssemblyLoadContext.Default.Unloading. Cela fonctionne très bien pour les applications console sur Linux, également dans Docker.

42
Marc Sigrist