c# - ¿Cómo codigo un Mono Daemon?
linux mono-service (7)
Estoy tratando de escribir un daemon Mono C # para Linux.
Me gustaría hacer un comienzo 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 usaré eso por ahora.
Editar: también estoy implementando esto en Java 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.
Existe el evento SessionEnd, pero solo está disponible para servicios y no para aplicaciones de consola
Respuesta: usar el servicio mono para envolver un servicio de Windows en Linux
Como alternativa, uso 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.
Consulte Windows como desarrollo de servicios en LINUX usando MONO?
David está en lo correcto, detener un servicio se logra a través de una señal UNIX, y debe usar un manejador de señal para atraparlo.
Debe implementar un servicio y usar un servicio único. Busque Google y encontrará varios ejemplos.
Miguel de Icaza escribió recientemente sobre un nuevo caparazón interactivo Mono C # que usted podría demonizar con la suficiente facilidad. Miguel tiene un artículo de seguimiento con un 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 2.2 de Mono, que aún no se ha lanzado. Sin embargo, el código está disponible en el repositorio svn de Mono .
Para recibir notificaciones en el modo Unix, es decir, usando señales, desea usar Mono.Unix.UnixSignal para cada señal que planea recibir y luego llamar a UnixSignal.WaitAny () en una matriz de señales.
Normalmente harías esto en un hilo separado.
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.
Por lo general, esto se acompaña 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 codifique para Mono, comprenderá bien el entorno para el que está codificando, ya que no hay diferencia entre un proceso Mono o un proceso nativo (creado en C, por ejemplo) o un script.
Dave
Un método simple sería escuchar en un puerto (local, alto) y recibir comandos de un cliente de administración, como bind hace.
Una forma más unix-ish sería registrar un manejador de señal usando UnixSignal y apagar apropiadamente al recibir cierta señal. Consulte las Preguntas frecuentes sobre Mono, "¿Puedo usar manejadores de señal con Mono?" para advertencias y un ejemplo.
lupus ha encontrado el mono-servicio , que es un proceso de alojamiento utilizando las interfaces de ServiceProcess
. Lamentablemente, esto requiere configurar MONO_DISABLE_SHM
, que desactiva algunas características en Mono, en particular, los sistemas IPC de proceso cruzado.