2008-10-09 10 views
52

Estoy tratando de escribir un daemon Mono C# para Linux.Cómo codigo un Mono Daemon

Me gustaría hacer un arranque y detenerlo cuando termine el proceso en lugar de simplemente matar el proceso.

¿Alguien tiene algún ejemplo de esto?

Editar: Descubrí cómo usar start-stop-daemon --background en debian, así que creo que lo usaré por ahora.

Editar: Estoy implementando esto en Java también y tienen este bonito addShutdownHook que atrapa la terminación de la aplicación. Necesito dedicar un poco más de tiempo a clasificar las dependencias para el servicio mono, o encontrar la manera de detectar la finalización de la aplicación.

No es el caso SessionEnd, pero eso es sólo está disponible para servicios y no la consola aplicaciones

Respuesta: using mono-service to wrap a windows service on linux

+0

yo también sería realmente el amor para ver cuál es la respuesta a ésta, he buscado sin éxito hace unos meses. –

+0

uso de un solo servicio viejo garbade collector whis se filtra en mi 2.10 en debian. Entonces uso cron junto con mono-sgen. – ikutsin

Respuesta

19

Debe implementar un servicio y usar un servicio único. Busque Google y encontrará varios ejemplos.

+0

suena como una buena solución, lo intentaré –

+17

Si los ejemplos son fáciles de encontrar, amablemente vincules aquí. Una referencia a Google es bastante inestable con el tiempo. – fbmd

+0

Me resultó más fácil escribir una aplicación de consola, ya que entonces es trivial ejecutar la aplicación en segundo plano en Linux, lo que la convierte en un "daemon". – markmnl

16

Un método simple sería la de escuchar en un puerto (local, alta) y recibir comandos de un cliente de administración, como bind hace.

Una forma más unix-ish sería register a signal handler usando UnixSignal y se apaga correctamente al recibir una determinada señal. Vea el Mono FAQ, "Can I use signal handlers with Mono?" para advertencias y un ejemplo.

lupus ha encontrado mono-service, que es un proceso de alojamiento utilizando las interfaces ServiceProcess. Lamentablemente, esto requiere configurar MONO_DISABLE_SHM, que desactiva algunas funciones en Mono, en particular, los sistemas IPC de proceso cruzado.

+0

Debería estar bien con la falta de IPC –

4

Un daemon en Linux normalmente escucha señales, como la señal de muerte, pero hay otras que le permiten hacer cosas como un reinicio suave (se lee en la configuración), y así sucesivamente.

Normalmente, esto va acompañado de un script en el directorio /etc/init.d que controla el inicio y la detención de dichos daemons. Normalmente, un archivo pid se crea en/var/run, que mantiene la identificación del proceso para que el script identifique el proceso rápidamente.

Incluso cuando se codifica Mono, se entiende bien el entorno para el que se está codificando, ya que no hay diferencia entre un proceso Mono o un proceso nativo (creado en C, por ejemplo) o un script.

de Dave

0

Miguel de Icaza escribió recientemente sobre un nuevo Mono C# interactive shell que usted debería ser capaz de demonizar con bastante facilidad. Miguel tiene un follow-up article con algún código fuente que muestra cómo puede incluir el shell interactivo en otras aplicaciones de C#. Puede servir como un buen punto de partida para su daemon.

Tenga en cuenta que el shell interactivo requiere la versión Mono 2.2, que aún no se ha lanzado. Sin embargo, el código está disponible en Mono's svn repository.

+0

forma interesante de hacerlo, estoy poniendo esto en producción, así que estoy usando solo las versiones de mono lanzadas. –

0

David está en lo cierto, la detención de un servicio se realiza a través de una señal UNIX, y debe usar un manejador de señal para atraparla.

25

Para recibir notificaciones en el modo Unix, es decir, utilizando señales, desea usar el Mono.Unix.UnixSignal para cada señal que desea recibir y luego llamar a UnixSignal.WaitAny() en una matriz de señales.


Normalmente lo haría en un hilo separado.

0

Como alternativa, utilizo un script de shell. Inicia mi aplicación mono, y luego, cuando mi aplicación se cierra (intencionalmente o no), mira las señales de devolución que mi aplicación haya configurado. Esto se puede usar para ordenar al script que copie en una actualización, reinicie o salga. Si mi aplicación falla, no se devuelve ninguna señal, por lo que el script reiniciará mi aplicación y me enviará un correo electrónico con las últimas líneas de la salida de la consola.

Ver Windows like services development in LINUX using MONO?