Necesito escribir código robusto en .NET para permitir que un servicio de Windows (servidor 2003) se reinicie. ¿Cuál es la mejor manera de hacer esto? ¿Hay alguna API de .NET para hacerlo?
.net
windows
windows-services
windows-server-2003
Ron Harlev
fuente
fuente
Respuestas:
Configure el servicio para que se reinicie después de un error (haga doble clic en el servicio en el panel de control y eche un vistazo a esas pestañas; olvido el nombre). Luego, cada vez que desee que se reinicie el servicio, simplemente llame
Environment.Exit(1)
(o cualquier devolución que no sea cero) y el sistema operativo lo reiniciará por usted.fuente
Service.ExitCode = 1
y luego ejecutarService.Stop()
junto con la casilla de verificación 'Habilitar acciones para paradas con errores' en la pantalla de configuración de recuperación del servicio. Hacerlo de esta manera permite un apagado adecuado y aún así activa el reinicio.fuente
No puede estar seguro de que la cuenta de usuario con la que se ejecuta su servicio tenga incluso permisos para detener y reiniciar el servicio.
fuente
Puede crear un proceso que sea un símbolo del sistema de DOS que se reinicie:
fuente
donde
SERVICENAME
está el nombre de su servicio (las comillas dobles incluidas para dar cuenta de los espacios en el nombre del servicio, de lo contrario, se pueden omitir).Limpio, no es necesaria la configuración de reinicio automático.
fuente
Dependerá de por qué quiere que se reinicie.
Si solo está buscando una manera de que el servicio se limpie periódicamente, entonces podría tener un temporizador ejecutándose en el servicio que periódicamente provoca una rutina de purga.
Si está buscando una forma de reiniciar en caso de falla, el host del servicio en sí mismo puede proporcionar esa capacidad cuando se configura.
Entonces, ¿por qué necesita reiniciar el servidor? ¿Qué estás intentando lograr?
fuente
No creo que pueda hacerlo en un servicio autónomo (cuando llama a Reiniciar, detendrá el servicio, lo que interrumpirá el comando Reiniciar, y nunca volverá a comenzar). Si puede agregar un segundo .exe (una aplicación de consola que usa la clase ServiceManager), puede iniciar el .exe independiente y hacer que reinicie el servicio y luego salga.
Pensándolo bien, probablemente podría hacer que el servicio registre una Tarea Programada (usando el comando 'at' de la línea de comandos, por ejemplo) para iniciar el servicio y luego hacer que se detenga; eso probablemente funcionaría.
fuente
El problema con el desplazamiento hacia un archivo por lotes o EXE es que un servicio puede tener o no los permisos necesarios para ejecutar la aplicación externa.
La forma más limpia de hacer esto que he encontrado es utilizar el método OnStop (), que es el punto de entrada para el Administrador de control de servicios. Luego, se ejecutará todo el código de limpieza y no tendrá ningún socket colgado u otros procesos, suponiendo que su código de detención esté haciendo su trabajo.
Para hacer esto, debe establecer un indicador antes de finalizar que le indique al método OnStop que salga con un código de error; entonces el SCM sabe que el servicio debe reiniciarse. Sin este indicador, no podrá detener el servicio manualmente desde SCM. Esto también supone que ha configurado el servicio para reiniciar en caso de error.
Aquí está mi código de parada:
Si el servicio se encuentra con un problema y necesita reiniciarse, inicio un subproceso que detiene el servicio desde el SCM. Esto permite que el servicio se limpie después de sí mismo:
fuente
Usaría el Programador de Windows para programar un reinicio de su servicio. El problema es que no puede reiniciarse, pero puede detenerse. (Esencialmente has cortado la rama en la que estás sentado ... si entiendes mi analogía) Necesitas un proceso separado para hacerlo por ti. El Programador de Windows es apropiado. Programe una tarea única para reiniciar su servicio (incluso desde el propio servicio) para ejecutarlo de inmediato.
De lo contrario, tendrá que crear un proceso de "pastoreo" que lo haga por usted.
fuente
La primera respuesta a la pregunta es la solución más simple: "Environment.Exit (1)" Estoy usando esto en Windows Server 2008 R2 y funciona perfectamente. El servicio se detiene solo, el O / S espera 1 minuto y luego lo reinicia.
fuente
No creo que pueda. Cuando un servicio se "detiene", se descarga totalmente.
Bueno, bien, siempre hay una forma, supongo. Por ejemplo, podría crear un proceso separado para detener el servicio, luego reiniciarlo y luego salir.
fuente
El mejor enfoque puede ser utilizar el Servicio NT como envoltorio para su aplicación. Cuando se inicia el Servicio NT, su aplicación puede iniciarse en un modo "inactivo" esperando que se inicie el comando (o configurarse para iniciarse automáticamente).
Piense en un automóvil, cuando se enciende comienza en un estado inactivo, esperando que su comando avance o retroceda. Esto también permite otros beneficios, como una mejor administración remota, ya que puede elegir cómo exponer su aplicación.
fuente
Simplemente pasando: y pensé que agregaría información adicional ...
También puede lanzar una excepción, esto cerrará automáticamente el servicio de Windows, y las opciones de reinicio automático simplemente se activan. El único problema con esto es que si tiene un entorno de desarrollo en su PC, entonces el JIT intenta entrar en acción, y recibirá un mensaje que dice depurar S / N. diga no y luego se cerrará y luego se reiniciará correctamente. (en una PC sin JIT, todo funciona). La razón por la que estoy trolleando, es que este JIT es nuevo en Win 7 (solía funcionar bien con XP, etc.) y estoy tratando de encontrar una forma de deshabilitar el JIT ... Puedo probar el método Environment.Exit mencionado aquí, vea cómo Eso también funciona.
Kristian: Bristol, Reino Unido
fuente
Cree un archivo restart.bat como este
Luego elimine la tarea% taskname% cuando comience su% service%
fuente
Cree un dominio de aplicación separado para alojar el código de la aplicación. Cuando se requiere reiniciar, podríamos descargar y volver a cargar el dominio de aplicación en lugar del proceso (servicio de Windows). Así es como funciona el grupo de aplicaciones IIS, no ejecutan la aplicación asp.net directamente, usan appdmain por separado.
fuente
La forma más fácil es tener un archivo por lotes con:
parada neta inicio neto
y agregue el archivo al planificador con el intervalo de tiempo deseado
fuente
fuente