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

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

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

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

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

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

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

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


person Scott Cowan    schedule 09.10.2008    source источник
comment
Мне тоже очень хотелось бы увидеть ответ на этот вопрос, который я безуспешно искал несколько месяцев назад.   -  person Joel Martinez    schedule 09.10.2008
comment
моносервисное использование старого сборщика мусора в моей версии 2.10 на debian. Поэтому я использую cron вместе с mono-sgen.   -  person ikutsin    schedule 13.07.2011


Ответы (7)


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

person lupus    schedule 11.10.2008
comment
Если примеры легко найти, пожалуйста, свяжите их здесь. Ссылка на Google довольно нестабильна с течением времени. - person fbmd; 24.05.2013
comment
Мне было проще написать консольное приложение, так как в этом случае запускать приложение в фоновом режиме в Linux тривиально, что делает его демоном. - person markmnl; 27.03.2014
comment
Но как это работает, если вы mkbundle заполнили приложение Mono? - person Cocowalla; 24.04.2014
comment
Только для потомков. Вот как вы можете использовать POSIX (службу стиля unix) github.com/ServiceStack/ServiceStack/wiki/ А вот как вы создаете службу типа Windows, работающую в Unix stackoverflow.com/questions/15359190/ - person Archlight; 02.06.2014
comment
Я реализовал приложение-службу Windows и работаю на Ubuntu с моно-службой. Когда я перезагрузил систему, мое приложение остановилось, и мне нужно снова запустить моно-сервис. Это какая-то общая проблема? Кто-нибудь сталкивался с этим? - person kat1330; 23.03.2016

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


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

person miguel.de.icaza    schedule 19.10.2008

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

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

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

person David Schmitt    schedule 09.10.2008
comment
Я должен быть в порядке с отсутствием IPC - person Scott Cowan; 08.12.2008

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

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

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

Дэйв

person Dave Van den Eynde    schedule 09.10.2008

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

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

person godbyk    schedule 10.10.2008
comment
интересный способ сделать это, я запускаю это в производство, поэтому я использую только выпущенные версии моно. - person Scott Cowan; 10.10.2008

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

person Ana Betts    schedule 10.10.2008

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

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

person FlappySocks    schedule 20.06.2010