2013-03-05 29 views
2

如何重新啓動Windows服務請求?我知道Environment.Exit(1)連同恢復選項服務設置,但如果服務真的出錯,該怎麼辦?如何獲得服務以請求重新啓動?

背景:

我們有一堆使用自主組件作爲我們的SOA架構的一部分的Windows服務。我們希望在自主組件更新時重新啓動服務,但我們不希望每天限制爲兩次重新啓動(發佈),並且如果存在真正的錯誤,我們不希望該服務無限期地重新啓動。

回答

1

我們得到了周圍這樣做:

using System.Diagnostics; 

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\""); 

看來Process.Start()要麼不創建子進程,或者當父母去世那子進程沒有被殺死。

請注意,進程運行的用戶必須具有啓動和停止進程的權限。

2

我已經創建了一些使用此技術的自更新服務。我發現依靠恢復選項並不理想,因爲它通常會讓系統管理員覺得您的服務正在他們的機器上爆炸(向事件日誌寫入由於服務意外停止而發生服務恢復)。

我在我的例子中做了什麼,雖然這很冒險但很有效,它是在服務安裝期間創建的帳戶下啓動特製的可執行文件。該帳戶被拒絕登錄權限,並且只能控制我們的特定服務(使用icacals或同等授權服務控制權限)。啓動可執行文件,它使用許多預定義的OnCustomCommandservice commands與服務進行通信,告訴服務它已被更新,它需要完成它的工作,並儘快關閉它。可執行文件等待一段時間,一旦服務停止,它會圍繞二進制文件移動,並執行許多其他自定義步驟,然後啓動服務備份並退出。

我確信有更乾淨的方法可以做到這一點,但在找了幾個小時後沒有拿出更清潔的東西之後,我決定這會適用於我們的情況。在大量計算機上安裝這些產品之前,我一直沒有遇到任何問題,除了由於管理員與運行該可執行文件的用戶帳戶相關的偶然性權限問題。

+0

感謝您的輸入。對需要嚴格用戶帳戶控制的環境非常有用。 – sennett 2013-03-05 22:09:02