c# - reiniciar - Se inició el servicio de Windows en la computadora local y luego se detuvo el error
windows no pudo iniciar el servicio windows search en equipo local error 3 (9)
Es posible que desee probar la inicialización de la unidad, pero como está en el método OnStart
, es casi imposible. Sugeriría mover el código de inicialización a una clase separada para que pueda ser probado o al menos reutilizado en un comprobador de formularios.
En segundo lugar, agregue un poco de registro (usando Log4Net o similar) y agregue algunos registros detallados para que pueda ver detalles sobre los errores de tiempo de ejecución. Ejemplos de errores de tiempo de ejecución serían AccessViolation
etc. especialmente si su servicio se está ejecutando sin suficientes privilegios para acceder a los archivos de configuración.
Normalmente, recibo este error: (el servicio "nombre de servicio" en la computadora local se inició y luego se detuvo. Algunos servicios se detienen automáticamente si no están siendo utilizados por otros servicios o programas) cuando hay algún problema con mi código, como no existente rutas de acceso, etc. El servicio de Windows no se iniciará.
Tengo un servicio de Windows que realiza una copia de seguridad de la carpeta / archivos, en una ubicación si alcanzó el límite de tamaño. Los detalles son proporcionados por una Configuración XML que el servicio de Windows lee al inicio. Tengo un formulario de Windows separado que tiene un botón que hace exactamente lo que está haciendo el inicio de mi servicio de Windows. Uso mis formularios de Windows para depurar el código antes de ponerlo en mi servicio de Windows.
Cuando comienzo mis formularios de Windows. Hace lo que se supone que debe hacer. Cuando puse mi código en el servicio de Windows, el método OnStart () apareció el error.
Aquí está mi código:
protected override void OnStart(string[] args)
{
private static string backupConfig = @"D:/LogBackupConfig/backupconfig.xml";
private static string serviceStat = @"D:/LogBackupConfig/Status.txt";
private static string fileFolderStat = @"D:/LogBackupConfig/FileFolderStat.txt";
protected override void OnStart(string[] args)
{
if (File.Exists(backupConfig))
{
FileSystemWatcher watcher = new FileSystemWatcher();
XmlTextReader reader = new XmlTextReader(backupConfig);
XmlNodeType type;
List<string> listFile = new List<string>();
string fileWatch = "";
//this loop is for reading XML elements and assigning to variables
while (reader.Read())
{
type = reader.NodeType;
if (type == XmlNodeType.Element)
{
if (reader.Name == "File")
{
reader.Read();
fileWatch = reader.Value;
}
else if (reader.Name == "Folder")
{
reader.Read();
fileWatch = reader.Value;
}
}
}
reader.Close();
watcher.Path = fileWatch;
watcher.Filter = "*.*";
//this loop reads whether the service will watch a file/folder
XmlTextReader reader1 = new XmlTextReader(backupConfig);
while (reader1.Read())
{
type = reader1.NodeType;
if (type == XmlNodeType.Element)
{
if (reader1.Name == "File")
{
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChangedFile);
}
else if (reader1.Name == "Folder")
{
watcher.IncludeSubdirectories = true;
watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
}
}
}
reader1.Close();
watcher.EnableRaisingEvents = true;
}
else
{
StreamWriter sw = new StreamWriter(serviceStat, true);
sw.WriteLine("File not found. Please start the Log Backup UI first.");
sw.Close();
}
}
No sé qué es lo que hace que el servicio de Windows no se inicie, el simulador de Windows funcionaba bien. ¿Cuál parece ser el problema?
ACTUALIZACIÓN: después de muchas pruebas, he notado que al usar solo un directorio de carpetas (sin archivo), el servicio de Windows no funciona. Cuando reemplacé la variable de FileWatch con un archivo específico (incluido su directorio), se inició el servicio de Windows. Cuando lo cambié a una ubicación de carpeta, no funcionó. Lo que creo es que las ubicaciones de las carpetas no funcionan en un vigilante de archivos.
Cuando traté de crear un nuevo servicio de Windows que mirara una ubicación de carpeta, funcionó ... Sin embargo, cuando probé la misma ubicación en mi servicio de Windows original, ¡no funcionó! ¡Tenía la mente $ # * ed! Parece que tengo que crear un nuevo servicio de Windows y construir el instalador cada vez que coloque un nuevo código / función. De esta forma puedo hacer un seguimiento de donde obtengo un error.
EventLog.Log debe establecerse como "Aplicación"
La cuenta que está ejecutando el servicio puede no haber mapeado el D: -drive (son específicos del usuario). Intente compartir el directorio y use la ruta UNC completa en su backupConfig
.
Su watcher
de tipo FileSystemWatcher
es una variable local, y está fuera del alcance cuando se OnStart
método OnStart
. Probablemente lo necesite como una instancia o variable de clase.
Me encontré con el mismo problema. Mi servicio está cargando / recibiendo XMLS y escribiendo los errores en el Registro de eventos.
Cuando fui al Registro de eventos, traté de filtrarlo. Me indicó que el registro de eventos estaba dañado.
Borré el registro de eventos y todo está bien.
Me pareció muy útil convertir su servicio de Windows existente a una consola simplemente cambiando su programa con lo siguiente. Con este cambio, puede ejecutar el programa depurando en Visual Studio o ejecutando el ejecutable normalmente. Pero también funcionará como un servicio de Windows. También hice una publicación en un blog sobre eso
program.cs
class Program
{
static void Main()
{
var program = new YOUR_PROGRAM();
if (Environment.UserInteractive)
{
program.Start();
}
else
{
ServiceBase.Run(new ServiceBase[]
{
program
});
}
}
}
YOUR_PROGRAM.cs
[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
public YOUR_PROGRAM()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Start();
}
protected override void OnStop()
{
//Stop Logic Here
}
public void Start()
{
//Start Logic here
}
}
No estoy seguro de que esto sea útil, pero para depurar un servicio siempre puedes usar lo siguiente en el método OnStart:
protected override void OnStart(string[] args)
{
System.Diagnostics.Debugger.Launch();
...
}
de lo que podrías unir tu estudio visual al proceso y tener mejores habilidades de depuración.
Espero que esto haya sido útil, buena suerte
Si el servicio se inicia y se detiene así, significa que su código arroja una excepción no controlada. Esto es bastante difícil de depurar, pero hay algunas opciones.
- Consulte el Visor de eventos de Windows. Normalmente puede acceder a esto yendo al administrador de la computadora / servidor, luego haciendo clic en Visor de eventos -> Registros de Windows -> Aplicación . Puede ver qué arrojó la excepción aquí, lo que puede ayudar, pero no obtiene el seguimiento de la pila.
- Extraiga la lógica de su programa en un proyecto de clase de biblioteca. Ahora cree dos versiones diferentes del programa: una aplicación de consola (para la depuración) y el servicio de Windows. (Esto es un poco esfuerzo inicial, pero ahorra mucha angustia a largo plazo).
- Agregue más bloques de prueba / captura e inicie sesión en la aplicación para obtener una mejor idea de lo que está sucediendo.
Use el evento Timer and tick para copiar sus archivos.
Al iniciar el servicio, comience la hora y especifique el intervalo en el tiempo.
Entonces, el servicio sigue funcionando y copia los archivos ontick.
Espero que ayude
Verifique que haya registrado todos los puntos finales HTTP en la lista de control de acceso (ACL) de mahcine local.
http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html