2009-12-31 19 views
35

Ho un servizio Windows personalizzato che eseguo su un numero di VM Hyper-V. Le macchine virtuali vengono riavviate un paio di volte all'ora come parte di alcuni test automatici in esecuzione. Il servizio è impostato su avvio automatico e quasi tutto il tempo, si avvia bene."Un timeout è stato raggiunto mentre si attende la connessione del servizio" errore dopo il riavvio

Tuttavia, forse il 5% delle volte, senza alcun motivo che riesco a distinguere, il servizio non riesce ad avviarsi. In caso di errore, viene visualizzato un errore nel Visualizzatore eventi che indica

È stato raggiunto un timeout (30000 millisecondi) durante l'attesa del collegamento del servizio My Name Name.

In questo caso, posso avviare manualmente il servizio o riavviarlo e il servizio verrà avviato correttamente.

La cosa che non riesco a capire è che il timeout di 30 secondi non sembra essere presente nel mio codice. La prima riga del metodo OnStart() della mia classe di servizio registra "Starting ..." nel suo log log4net. Quando il servizio non si avvia, non riesco nemmeno a registrare nulla, il che mi indica che log4net non può accedere per qualsiasi motivo, o il timeout si verifica prima che il mio OnStart() venga chiamato.

Il servizio viene eseguito su una varietà di sistemi operativi, da XP fino a Win7 e 2008R2, e so che impostare il servizio su avvio ritardato può risolvere questo per Vista e successivi, ma sembra un trucco.

Non sono stato in grado di eseguire il debug remoto a causa del fatto che accade in modo intermittente e durante l'avvio del sistema, e sono in perdita per ulteriori modi per cercare di capire cosa sta succedendo. Qualche idea?

+0

Il servizio dipende da altri servizi o i servizi dipendono dal servizio per iniziare? –

+0

No, è completamente autonomo. –

+0

Che tipo di appender stai usando per log4net? –

risposta

10

Si potrebbe voler vedere questo post, non è identico alla situazione, ma la soluzione offre un buon consiglio sui servizi di Windows e funzionalità di avvio.

+2

Grazie, questo è quello che ho fatto - impostando ServicesPipeTimeout a 120 secondi su tutte le macchine virtuali su cui questo servizio viene eseguito. –

+0

Seguendo il link sopra, ho messo diverse chiamate a SetServerStatus nel codice che conduco durante OnStart. In effetti questo informa il sistema sui progressi e impedisce attivamente il timeout. –

5

La mia ipotesi - e questo è tutto - è che il disco è molto impegnativo durante l'avvio, al punto in cui lo stesso .NET Framework non viene avviato nei 30 secondi che Windows alloca per l'avvio dei servizi.

Una soluzione alternativa potrebbe essere quella di impostare il servizio per l'avvio manuale, quindi scrivere un piccolo stub service nel codice non gestito (ad esempio C++, Delphi) per avviare il servizio.

Un altro approccio potrebbe essere quello di avviare il servizio in remoto da un'altra macchina. Il comando sc dovrebbe fare bene il lavoro.

+0

Nel mio caso la prima riga in OnStart era quella di accedere con log4net ma non ho mai visto questo messaggio di registro (non ho visto nessun messaggio di registro dal servizio). Il computer era vecchio e il disco non molto veloce. Dopo aver modificato ServicesPipeTimeout a 60 secondi, il servizio è stato avviato. (http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/several-service-control-manager-issues-event-ids/5eb047bb-e5bf-47b3-a661-299f6f9835ba) –

1

Penso di aver trovato anche un altro fattore che contribuisce a questo tipo di errore di riavvio non avviato.

Sembra che se il registro eventi di Windows è impostato su Sovrascrivi eventi> 7 giorni .. dimensione 512 kb .. Ma all'interno di questa finestra si è verificata molta attività, quindi il registro degli eventi è effettivamente pieno perché non può sovrascrivere il numero di eventi generati all'interno di quel periodo di tempo. Se si imposta il registro eventi su una dimensione molto più grande OPPURE su Sovrascrivi come necessario, non si verificherà questo problema

3

Per quello che vale, ho scoperto che ho ricevuto questo messaggio (quasi immediatamente all'avvio del servizio) perché non l'ho fatto avere la versione 4.5 del framework .NET installato sul computer di destinazione. Ho eseguito il rollback della versione che stavo usando alla versione 4.0 (che era già installata sul computer di destinazione) e il servizio ha funzionato come previsto.

+0

Grazie! E 'un peccato che non ti dica solo che manca il framework:/ – user145400

0

Il mio problema con lo stesso errore era che il.L'installazione di rete sul server non funzionava correttamente.

di conoscere questo numero:

Ho fatto una piccola console app con logica identica come il servizio di esecuzione, e ho fatto un try-catch attorno al pezzo di codice complesso, dumping tutto per console.

Non sono sicuro del motivo per cui le informazioni non sono esplose, ma abbiamo visto i preziosi messaggi sugli errori del Framework che non avremmo mai visto diversamente.

2

Stavo vedendo questo errore nel Visualizzatore eventi durante il tentativo di installare un servizio con PowerShell.

Il problema era che avevo valori diversi per "Nome servizio" e "Nome visualizzato servizio" nel mio script PowerShell a quelli che avevo specificato nel file program.cs della mia Applicazione console.

+1

Sei un risparmiatore di vita! – MEMark

0

Stiamo riscontrando lo stesso problema su Windows 2016 Server.

Una correzione che sembra funzionare sta cambiando l'utente con il quale il servizio viene eseguito dall'account del servizio locale all'amministratore locale (non è sicuro quale sia la causa).

Problemi correlati