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

Как закодировать Mono Daemon

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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


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

Ответ 3

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

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

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

Ответ 4

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

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

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

Dave

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

См. Windows, как развитие служб в LINUX, используя MONO?