Как мне закодировать Демон Mono


Я пытаюсь написать демон Mono C# для linux.

Я хотел бы сделать запуск и остановки его, когда его обработка завершена, а не просто убить процесс.

есть ли у кого-нибудь примеры этого?

Edit: я понял, как использовать start-stop-daemon --background в debian, поэтому я думаю, что сейчас просто использую это.

Edit: я также реализую это на java, и у них есть этот хороший addShutdownHook, который ловит завершение приложения. Мне нужно потратить немного больше времени на сортировку зависимостей для службы mono или найти способ поймать завершение приложения.

есть событие SessionEnd, но это доступно только для служб, а не для консольных приложений

ответ: используя моно-служба обернуть служба Windows на Linux

7 52

7 ответов:

вы должны реализовать сервис и использовать моносервис. Google для этого, и вы найдете несколько примеров.

для получения уведомлений в Unix способом, то есть с помощью сигналов, вы хотите использовать моно.Юникс.UnixSignal для каждого сигнала, который вы планируете получить, а затем вызвать UnixSignal.WaitAny () на массиве сигналов.


обычно это делается в отдельном потоке.

простой метод будет прослушивать (локальный, высокий) порт и получать команды от клиента управления, например bind.

более unix-иш способ будет зарегистрировать обработчик сигнала используя UnixSignal и выключение правильно на получать некоторый сигнал. Смотрите моно FAQ, " могу ли я использовать обработчики сигналов с моно?" для предостережения и примера.

Красная нашел моно-служба, которым это процесс хостинга с использованием ServiceProcess интерфейсы. К сожалению, это требует установки MONO_DISABLE_SHM, который отключает некоторые функции в Моно, в частности, межпроцессные системы IPC.

демон под Linux обычно слушает сигналы, такие как сигнал kill, но есть и другие, которые позволяют ему делать такие вещи, как мягкий перезапуск (читает обратно в конфигурации) и т. д.

обычно это сопровождается скриптом в /etc / init.D каталог, который управляет запуском и остановкой таких демонов. Обычно pid-файл создается в /var / run, который сохраняет идентификатор процесса для сценария, чтобы быстро идентифицировать процесс.

даже при кодировании для Mono, вы бы хорошо понимали среду, для которой вы кодируете, так как нет никакой разницы между моно-процессом или собственным процессом (созданным в C, например) или скриптом.

Дэйв

Мигель де Икаса недавно писал о новом моно C# в интерактивной оболочке что вы должны быть в состоянии достаточно легко демонизировать. У Мигеля есть статье С некоторым исходным кодом, который показывает, как вы можете включить интерактивную оболочку в других приложениях C#. Это может служить хорошей отправной точкой для вашего демона.

обратите внимание, что интерактивная оболочка требует моно версии 2.2, которая еще не была выпущена. Код доступен по адресу репозиторий svn моно однако.

Дэвид прав, остановка службы выполняется с помощью сигнала UNIX, и вы должны использовать обработчик сигнала, чтобы поймать его.

в качестве альтернативы я использую сценарий оболочки. Он запускает мое приложение mono, а затем, когда мое приложение завершает работу (намеренно или непреднамеренно), смотрит на любые обратные сигналы, которые мое приложение установило. Это можно использовать для указания скрипту копировать в обновлении, перезапуске или выходе. Если мое приложение аварийно завершает работу, сигнал не возвращается, поэтому скрипт перезапустит мое приложение и отправит мне электронное письмо с последними строками вывода консоли.

посмотреть Windows, как разработка сервисов в LINUX с помощью Моно?