2013-05-31 15 views
5

Ho una domanda su come meglio verificare se un servizio è ancora in esecuzione.Il modo migliore per verificare se un servizio è stato sospeso

Prima un po 'di chiarimenti. Il servizio che ho è un'applicazione C# che può essere eseguita dalla riga di comando o può essere eseguita come servizio di Windows. La funzione del servizio consiste nel controllare le modifiche a un'origine dati di terze parti remota ed elaborare tali modifiche prima di aggiungerle al nostro data store locale.

Desidero essere in grado di identificare quando il servizio ha smesso di funzionare per qualsiasi motivo e avvisare qualcuno quando ciò accade nel modo più automatico possibile. Ciò deve avvenire indipendentemente dal fatto che il servizio venga eseguito come servizio di Windows o dalla riga di comando.

Ho già preso in considerazione il monitoraggio dell'archivio dati locale per le modifiche e la notifica quando le modifiche non sono avvenute per un determinato periodo di tempo, tuttavia ciò si è dimostrato un po 'troppo incoerente, poiché la frequenza delle modifiche apportate alla terza parte l'origine dei dati è variabile, il che significa che una mancanza prolungata di cambiamenti non indica necessariamente che il servizio ha smesso di funzionare, potrebbe semplicemente essere che non ci sono cambiamenti!

Ci sono dei suggerimenti su come potrei procedere a monitorarlo? Qualcuno ha qualche esperienza con qualcosa di simile?

Grazie, M

Modifica 1 Solo per dare una vaga idea di come funziona il servizio: il servizio 3rd party genera eventi quando i dati nuovi/aggiornati è disponibile in modo mio servizio si siede e aspetta per questi eventi da sollevare ed elaborare i dati restituiti nell'evento in rilievo. Ecco perché è difficile identificare quando non ci sono "modifiche" piuttosto che "servizio in crash".

Edit 2 Penso che ho bisogno di essere un po 'più chiaro: La ragione principale di questo monitoraggio è quello di informare l'utente su un potenziale problema sia con il servizio o con la connessione al servizio 3rd party. Il servizio stesso è a thread singolo e ha la gestione e la registrazione delle eccezioni appropriate. È probabile che questo servizio verrà eseguito su un server da qualche parte, quindi se ci sono problemi con il servizio e si interrompe l'aggiornamento del nostro archivio dati locale per qualsiasi motivo il servizio deve notificare a qualcuno.

+0

Il vostro servizio ha qualche tipo di ciclo di polling? –

+0

Puoi mostrarci una breve descrizione di cosa fa effettivamente il tuo servizio? Potremmo aiutare a identificare un luogo dove posizionare una qualche forma di battito cardiaco. – KingCronus

risposta

-1

La soluzione che ha funzionato per questo progetto era quella di utilizzare un'implementazione come l'heartbeat per consentire al servizio di notificarmi della sua disponibilità.

Poiché la nostra applicazione utilizza WebAPI, sono riuscito a impostare un endpoint che il servizio "ping" ogni [x] secondi.

È stato aggiunto un processo separato che controlla la data e l'ora dell'ultima notifica dal servizio e se tale valore non rientra in una soglia impostata, notifico all'utente che il servizio non è disponibile.

ho guardato utilizzando il ServiceController, ma che non sarebbe stato una soluzione ideale a causa della possibilità che la funzionalità aggiunta al servizio potrebbe essere eseguito come un'applicazione di console di Windows al posto di un servizio Windows.

4

si potrebbe prendere in considerazione qualcosa di simile a un 'battito':

Heartbeat activity for Windows Service

Ma la vostra considerazione principale dovrebbe funzionare il motivo per cui il servizio dovrebbe essere in grado di fermare/appendere? Tutte le eccezioni devono essere catturate e, nel peggiore dei casi, ripristinare il servizio allo stato di avvio dopo una breve attesa per evitare il sovraccarico della CPU.

Windows stesso ha una varietà di metodi per aiutare anche:

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options 

Se si progetta l'applicazione per utilizzare correttamente le eccezioni e gestirli in modo appropriato, non si dovrebbe mai avere un problema con il servizio 'impiccagione per qualche ragione'.

aggiuntive:

Non c'è modo per fare determinare la differenza tra "nessun lavoro richiesto" e un blocco?

+0

La cosa peggiore è se il servizio è multithread e il livelock o deadlock sta accadendo. –

+0

@MatthewWatson Sì, un battito cardiaco potrebbe essere d'aiuto, ma vorrei comunque considerare la causa principale. Deadlock e Livelock possono quasi sempre essere corretti utilizzando una programmazione threadsafe appropriata. – KingCronus

0

è possibile utilizzare la classe ServiceController in .net per monitorare i servizi.

Ho affrontato lo stesso problema in uno dei miei progetti.

Ho usato l'approccio seguente per monitorare il mio servizio.

  • prima cosa, mi sono collegato tutte le informazioni, gli errori dal mio servizio a Visualizzatore eventi in un formato standard come questo

misura eventid | datetime | messaggi

  • Poi Ho creato un altro servizio di notifica che ascolterà il visualizzatore eventi per gli eventi particolari, legge il messaggio dalla voce evento
  • se la voce di evento cade nel visualizzatore eventi invierà la posta notifica tramite SMTP
  • se non sono forniti con l'SMPT poi per le finestre delle applicazioni che ascoltano gli eventi e spettacoli messaggio utilizzando baloon o un messaggio scatola
Problemi correlati