Изящное убийство демона.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.

Другие вопросы по тегам