Tengo un sistema que utilizamos aquí que parece funcionar bastante bien con los servicios. Nuestro sistema implementado tiene alrededor de 20-30 servicios en un momento dado. En el trabajo utilizamos un producto llamado TopShelf lo puede encontrar aquí http://topshelf-project.com/
Básicamente TopShelf se encarga de muchas de las cosas relacionadas con el servicio. Instalación, desinstalación, etc. todo desde la línea de cmd del servicio. Una de las características más útiles es la capacidad de ejecutar como consola para la depuración. Crea un servicio y con un inicio de línea de cmd diferente puede ejecutarlo como una consola para ver el resultado del servicio. Agregamos una característica personalizada a este software que nos permite configurar los perfiles por adelantado. Básicamente, nuestros perfiles configuran algunas cosas como el registro, ubicaciones de recursos, etc. para que podamos controlar todo eso sin tener que republicar ningún código. Todo lo que hacemos es ejecutar una orden como
D: \ Services \ ServiceName.exe Core.Profiles.Debug o
D: \ Services \ ServiceName.exe Core.Profiles.Producción
para obtener diferentes configuraciones de registro.
Nuestro script de compilación crea las secuencias de comandos install.cmd y uninstall.cmd para cada uno de nuestros servicios. Todo lo que hacemos es copiar los archivos en el servidor y ejecutar la secuencia de comandos. Si queremos ver resultados de depuración, detenemos el servicio y hacemos doble clic en el exe y obtenemos una consola para leer todo el resultado.
Una cosa más que el topshelf tiene que no usamos porque no es necesario es el concepto de estantería (hay documentación en este sitio web para esto). Esto le permite actualizar el servicio sin tener que "reiniciar", pero aún necesita copiar los archivos manualmente a menos que cree un sistema automatizado para eso.
Sin embargo, mi sugerencia si necesita una disponibilidad del 100% del servicio es tener un sistema redundante. No importa cómo configure su servicio para las actualizaciones, no puede evitar fallas de hardware que causen tiempo de inactividad sin un sistema de failover automático. Si dicho sistema estuviera en su lugar, mi estrategia de actualización recomendada sería apagar 1 nodo, actualizar, probar, encender apagar el otro nodo, actualizar, probar y volver a encender el 2do nodo. Puedes hacer esto por supuesto con un simple script. Este puede ser un sistema más complicado de lo que necesita, pero si no puede desconectar un servicio para un simple reinicio que demora 5 segundos, entonces realmente necesita algún sistema para lidiar con los problemas de hardware porque puedo garantizar que eventualmente sucederá.
Véase también http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-can-update-itself-at-runtime/4002465#4002465 –