Подтвердить что ты не робот

Убийство изящно демона .NET Core, работающего на Linux

Я создал консольное приложение .NET Core, работающее как демон на машине Ubuntu 14.04.

Я хочу остановить службу, не форсируя ее, не имея возможности обрабатывать событие kill.

Как я могу это достичь?

4b9b3361

Ответ 1

Вы хотите отправить SIGTERM в выполняемый процесс:

kill <PID>

И процесс должен корректно завершить работу.

К сожалению, .NET Core недостаточно хорошо документирован, но способен обрабатывать сигналы Unix (в отличие от Моно). Проблема GitHub

Если вы используете Ubuntu с Upstart, вам нужно иметь init script, который отправляет сигнал kill на stop: Пример init script

Добавьте зависимость от вашего project.json:

"System.Runtime.Loader": "4.0.0"

Это даст вам AssemblyLoadContext.

Затем вы можете обработать событие SIGTERM:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;

Примечание:

Используя Mono, правильный способ обращения с ним будет через UnixSignal: Mono.Unix.Native.Signum.SIGTERM

Ответ 2

.NET Core значительно развился после ответа @Stefano год назад. В .NET Core 2.0 теперь вы можете использовать хорошо известное событие AppDomain.CurrentDomain.ProcessExit вместо AssemblyLoadContext.Default.Unloading. Он отлично работает для консольных приложений на Linux, а также в Docker.