c# - standard - Matando con gracia un demonio.NET Core ejecutándose en Linux
net core c# (2)
.NET Core ha evolucionado considerablemente desde la respuesta de @ Stefano hace un año. En .NET Core 2.0, ahora puede usar el evento conocido AppDomain.CurrentDomain.ProcessExit
lugar de AssemblyLoadContext.Default.Unloading
. Funciona bien para aplicaciones de consola en Linux, también en Docker.
Creé una aplicación de consola .NET Core que se ejecuta como un demonio en una máquina Ubuntu 14.04.
Quiero detener el servicio sin forzarlo, pudiendo manejar un evento de eliminación.
¿Cómo puedo conseguir esto?
Desea poder enviar un SIGTERM al proceso en ejecución:
kill <PID>
Y el proceso debe manejarlo para que se apague correctamente.
Desafortunadamente .NET Core no está bien documentado, pero es capaz de manejar señales Unix (de una manera diferente a la de Mono ). Tema de GitHub
Si usa Ubuntu con Upstart , lo que necesita es tener un script de inicio que envíe la señal de interrupción en una solicitud de detención: Ejemplo de script de inicio
Agrega una dependencia a tu proyecto.json :
"System.Runtime.Loader": "4.0.0"
Esto le dará el AssemblyLoadContext .
Entonces puedes manejar el evento SIGTERM:
AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;
Nota:
Usando Mono, la forma correcta de manejarlo sería a través de UnixSignal : Mono.Unix.Native.Signum.SIGTERM
EDITAR:
Como @Marc señaló en su respuesta reciente, esta ya no es la mejor manera de lograrlo. Desde .NET Core 2.0 AppDomain.CurrentDomain.ProcessExit
es el evento compatible.