Изящное убийство демона.NET Core, работающего в Linux
Я создал консольное приложение.NET Core, работающее в качестве демона на машине с Ubuntu 14.04.
Я хочу остановить службу, не форсируя ее, имея возможность обрабатывать событие kill.
Как мне этого добиться?
2 ответа
Вы хотите иметь возможность отправить SIGTERM в запущенный процесс:
kill <PID>
И процесс должен справиться с этим, чтобы правильно завершить работу.
К сожалению, .NET Core недостаточно хорошо документирован, но он способен обрабатывать сигналы Unix (иначе, чем Mono). Выпуск GitHub
Если вы используете Ubuntu с Upstart, вам нужно иметь скрипт инициализации, который посылает сигнал kill по запросу остановки: Пример скрипта инициализации
Добавьте зависимость к вашему project.json:
"System.Runtime.Loader": "4.0.0"
Это даст вам AssemblyLoadContext.
Затем вы можете обработать событие SIGTERM:
AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;
Замечания:
Используя Mono, правильный способ обработки будет через UnixSignal: Mono.Unix.Native.Signum.SIGTERM
РЕДАКТИРОВАТЬ:
Как отметил @Marc в своем недавнем ответе, это уже не лучший способ добиться этого. Из .NET Core 2.0 AppDomain.CurrentDomain.ProcessExit
это поддерживаемое событие.
.NET Core значительно эволюционировал со времени ответа @Stefano год назад. В.NET Core 2.0 теперь вы можете использовать хорошо известные AppDomain.CurrentDomain.ProcessExit
событие вместо AssemblyLoadContext.Default.Unloading
, Он отлично работает для консольных приложений в Linux, а также в Docker.