Как мне написать Mono Daemon

Я пытаюсь написать Mono C# для Linux.

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

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

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

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

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

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

7 ответов

Решение

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

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


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

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

Более универсальным способом было бы зарегистрировать обработчик сигнала с использованием UnixSignal и правильно завершить работу при получении определенного сигнала. См. Mono FAQ: "Могу ли я использовать обработчики сигналов с Mono?" за предостережения и пример.

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

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

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

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

Дейв

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

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

Видите Windows как разработку сервисов в LINUX с использованием MONO?

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

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

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