2013-05-31 70 views
5

我有關於如何最好地檢查服務是否仍在運行的問題。檢查服務是否掛起的最佳方法

先澄清一下。我擁有的服務是一個C#應用程序,可以從命令行運行,也可以作爲Windows服務運行。該服務的功能是檢查對遠程第三方數據源的更改,並在將這些更改添加到我們自己的本地數據存儲之前處理這些更改。

我希望能夠識別何時服務因任何原因而停止運行,並在發生這種情況時儘可能自動地通知某人。無論服務是作爲Windows服務運行還是從命令行運行,都需要這樣做。

我已經考慮監視本地數據存儲的變化並通知何時一段時間沒有發生變化,但是這已證明有點太不一致,因爲第三方的變化頻率數據源是可變的,這意味着長期缺乏變化並不一定表明服務已停止工作,而可能是沒有變化!

有沒有關於如何去監控這個的建議?任何人都有類似的工作經驗嗎?

感謝,男

編輯1 只給的服務是如何工作的一個粗略的想法:第三方服務引發事件時,新的/更新的數據是可用的,所以我的服務坐着等待這些事件以提高和處理在募集事件中返回的數據。因此,這就是爲什麼識別何時「沒有變化」而不是「服務崩潰」的棘手問題。

編輯2 我想我需要一個更清晰一點:這種監測的主要原因是通知用戶有關或者與服務或與連接到第三方服務的潛在問題。服務本身是單線程的,並具有適當的異常處理和日誌記錄。機會是這個服務將在某個服務器上運行,所以如果這個服務有任何問題,它會停止更新我們的本地數據存儲,無論出於什麼原因服務需要通知某人。

+0

你的服務是否有某種輪詢循環? –

+0

你能告訴我們你的服務實際上做了什麼嗎?我們可以幫助確定一個位置來定位某種形式的心跳。 – KingCronus

回答

-1

爲這個項目工作的解決方案是使用類似實施的心跳來允許服務通知我它的可用性。

因爲我們的應用程序使用WebAPI,我可以設置一個端點,服務每隔[x]秒「ping」一次。

已經添加了一個單獨的進程,它檢查來自服務的最後一個通知的日期和時間,如果不在設定的閾值範圍內,我會通知用戶服務不可用。

我看着使用的ServiceController但是,這不會是因爲添加到服務功能可以運行的Windows控制檯應用程序而不是Windows服務的可能性的理想解決方案。

4

你可能要考慮的東西像一個「心跳」:

Heartbeat activity for Windows Service

但你主要考慮的應該是工作,爲什麼你的服務應該能夠停止/掛機?所有異常都需要被捕獲,並且在最壞的情況下,在短暫等待之後將服務重置爲其啓動狀態,以防止CPU最大化。

Windows本身有多種方法也能幫助:

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

如果你設計你的應用程序能夠正確使用異常,並適當地處理它們,你不應該曾經有與您的服務「爲掛一個問題一些原因'。

附加:

難道就沒有辦法爲你決定「沒有工作需要」和懸掛之間的區別?

+0

最糟糕的是,如果服務是多線程的,活鎖或死鎖正在發生。 –

+0

@MthetheWWatson是的,心跳可能會有所幫助,但我仍然想要考慮根本原因。幾乎總是可以使用適當的線程安全編程來糾正死鎖和活鎖。 – KingCronus

0

您可以在.net中使用ServiceController類來監視服務。

我在我的一個項目中遇到了同樣的問題。

我用下面的方法來監視我的服務。

  • 第一件事情,我記錄的所有信息,從我的服務錯誤事件查看器中這樣

定製事件ID的標準格式|日期時間|消息

  • 然後我創建了另一個通知服務,該服務將收聽針對特定事件的 事件查看器,從 事件條目
  • 中讀取消息
  • 如果事件條目在事件查看器落在它會通過SMTP
  • 發送郵件 通知,如果你不具備SMPT然後去這聽活動Windows應用程序 和使用氣球或消息 框顯示消息
相關問題