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

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

52 голосов
/ 09 октября 2008

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

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

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

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

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

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

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

Ответы [ 7 ]

25 голосов
/ 19 октября 2008

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


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

19 голосов
/ 11 октября 2008

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

16 голосов
/ 09 октября 2008

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

Более универсальным способом unix-ish будет регистрация обработчика сигнала с использованием UnixSignal и корректное завершение работы при получении определенного сигнала. См. Mono FAQ: «Могу ли я использовать обработчики сигналов с Mono?» для пояснений и пример.

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

4 голосов
/ 09 октября 2008

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

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

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

Dave

0 голосов
/ 20 июня 2010

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

См. Разработка Windows-подобных сервисов в LINUX с использованием MONO?

0 голосов
/ 10 октября 2008

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

0 голосов
/ 10 октября 2008

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

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

...