2009-12-31 17 views
35

Ich habe einen benutzerdefinierten Windows-Dienst, den ich auf mehreren Hyper-V-VMs ausführe. Die VMs werden einige Male pro Stunde neu gestartet, wenn automatisierte Tests ausgeführt werden. Der Dienst ist auf automatischen Start eingestellt und fast immer läuft es gut an."Es wurde ein Timeout beim Warten auf die Verbindung des Dienstes erreicht" Fehler nach dem Neustart

Aber vielleicht 5% der Zeit, ohne Muster, die ich erkennen kann, startet der Dienst nicht. Wenn es fehlschlägt, erhalte ich einen Fehler in der Ereignisanzeige mit der Meldung

Ein Zeitlimit wurde erreicht (30000 Millisekunden), während ich darauf wartete, dass der My Service Name-Dienst eine Verbindung herstellt.

Wenn dies der Fall ist, kann ich den Dienst manuell starten oder neu starten und der Dienst wird gut gestartet.

Die Sache, die ich nicht herausfinden kann ist, dass die 30-Sekunden-Timeout nicht in meinem Code auftritt. Die erste Zeile der OnStart() - Methode meiner Serviceklasse protokolliert "Starting ..." in ihrem log4net-Protokoll. Wenn der Dienst nicht startet, erhalte ich überhaupt nichts, was anzeigt, dass entweder log4net aus irgendeinem Grund nicht protokolliert werden kann oder das Zeitlimit auftritt, bevor mein OnStart() aufgerufen wird.

Der Dienst läuft auf einer Vielzahl von Betriebssystemen, von XP bis hin zu Win7 und 2008R2, und ich weiß, dass das Einstellen des Dienstes auf verzögerten Start dies für Vista und später lösen kann, aber das scheint wie ein Hack.

Ich konnte nicht Remote-Debugging dies aufgrund der Tatsache, dass es so intermittierend und während des Systemstarts passiert, und ich bin ratlos zu weiteren Möglichkeiten, um herauszufinden, was los ist. Irgendwelche Ideen?

+0

Ist Ihr Dienst abhängig von anderen Diensten oder sind Dienste von Ihrem Dienst abhängig, um zu starten? –

+0

Nein, es ist komplett eigenständig. –

+0

Welche Art von Appender verwenden Sie für log4net? –

Antwort

10

Vielleicht möchten Sie sich dieses post ansehen, es ist nicht identisch mit Ihrer Situation, aber die Lösung bietet einen guten Ratschlag für Windows-Dienste und Startfunktionen.

+2

Danke, Das war es, was ich getan habe - das Setzen von ServicesPipeTimeout auf allen VMs, auf denen dieser Dienst läuft, auf 120 Sekunden. –

+0

Nach dem obigen Link, habe ich mehrere Aufrufe an den SetServerStatus in dem Code, den ich während OnStart führe. Tatsächlich informiert dies das System über den Fortschritt und verhindert aktiv die Zeitüberschreitung. –

5

Meine Vermutung - und das ist alles - ist, dass die Festplatte während des Starts so hart schlägt, dass das .NET Framework nicht in den 30 Sekunden startet, die Windows für den Start von Diensten zuweist.

Eine kludgy Problemumgehung kann sein, den Dienst so festzulegen, dass er manuell startet, und dann einen sehr kleinen Stub-Dienst in nicht verwalteten Code (z. B. C++, Delphi) schreibt, um den Dienst zu starten.

Ein anderer Ansatz könnte sein, den Dienst remote von einer anderen Maschine zu starten. Der Befehl sc sollte die Arbeit gut machen.

+0

In meinem Fall war die erste Zeile im OnStart mit log4net zu loggen, aber ich habe diese Protokollnachricht nie gesehen (ich habe keine Protokollnachrichten vom Dienst gesehen). Der Computer war alt und die Festplatte nicht wirklich schnell. Nachdem der ServicesPipeTimeout auf 60 Sekunden geändert wurde, wurde der Dienst gestartet. (http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/several-service-control-manager-issues-event-ids-5eb047bb-e5bf-47b3-a661-299f6f9835ba) –

1

Ich denke, ich habe auch einen anderen beitragenden Faktor zu dieser Art von nicht bei Neustart Fehler gefunden haben gefunden.

Es scheint, dass, wenn das Windows-Ereignisprotokoll auf Ereignisse überschreiben> 7days festgelegt ist. Größe 512 KB .. Aber eine Menge Aktivität ist in diesem Fenster aufgetreten, dann Ereignisprotokoll ist effektiv voll, da es die Zahl nicht überschreiben kann von Ereignissen, die innerhalb dieses Zeitrahmens generiert werden. Wenn Sie das Eventlog auf eine viel größere Größe setzen ODER nach Bedarf überschreiben, wird dieses Problem nicht auftreten

3

Für was es wert ist, entdeckte ich, dass ich diese Nachricht erhielt (fast sofort nach dem Start des Dienstes), weil ich es nicht tat Auf dem Zielcomputer muss Version 4.5 des .NET-Frameworks installiert sein. Ich habe die Version, die ich verwendet habe, auf Version 4.0 zurückgesetzt (die bereits auf dem Zielcomputer installiert war), und der Dienst hat wie erwartet funktioniert.

+0

Danke! Es ist bedauerlich, dass es nicht nur sagt, dass das Framework fehlt:/ – user145400

0

Mein Problem mit dem gleichen Fehler war, dass die.Die Net-Installation auf dem Server funktionierte nicht korrekt.

dies herauszufinden:

ich eine kleine Konsolenanwendung mit identischer Logik als ausführendes Dienst gemacht, und ich habe einen try-catch um den gesamten Code Stück sie alle heraus zu Konsole Dumping.

Nicht sicher, warum die Informationen nicht aufblähten, aber wir sahen die wertvollen Nachrichten über die Framework-Fehler, die wir sonst nie gesehen hätten.

2

Ich sah diesen Fehler in der Ereignisanzeige beim Versuch, einen Dienst mit Powershell zu installieren.

Das Problem, das ich hatte, war, dass ich unterschiedliche Werte für "Service Name" und "Service Display Name" in meinem Powershell-Skript zu denen hatte, die ich in der Datei program.cs meiner Konsolenanwendung angegeben hatte.

+1

Du bist ein Lebensretter! – MEMark

0

Wir haben das gleiche Problem auf Windows 2016 Server.

Ein Fix, der zu funktionieren scheint, ändert den Benutzer, unter dem der Dienst vom lokalen Dienstkonto zum lokalen Administrator ausgeführt wird (nicht sicher, was die Ursache ist).

Verwandte Themen