2011-03-29 105 views
0

我對Windows服務進行了編程,並且它正在Windows 2000計算機上運行。有時該服務的可執行文件會死亡,但Windows服務在服務管理器中仍被列爲「已啓動」。在這種情況下,爲此服務定義的重新啓動行爲不生效。Windows服務已啓動,但進程在任務管理器中消失

當然,該過程需要調試,但我現在正在尋找解決方法。

我該如何避免這種情況? Windows 2000中的服務管理器如何確定Windows 2000進程是否仍然啓動?

回答

2

這可能意味着服務崩潰。 IIRC,當服務進程異常終止時,舊版本的Windows並不總能恢復。但那是很多年前的事情,我的記憶可能是錯誤的。

避免這種情況的最好方法是弄清楚是什麼導致你的服務崩潰並修復它。

+0

Larry:+1。您是否碰巧知道發送'SERVICE_CONTROL_INTERROGATE'是否會將SCM指向問題服務進程已經死亡的事實? – 0xC0000022L 2011-03-29 18:50:57

+0

我不知道,這當然值得一試... – 2011-03-30 04:46:24

0

雖然Larry作爲微軟的員工,可能比其他人更瞭解我,但我敢說你應該給ChangeServiceConfig2一個SERVICE_CONFIG_FAILURE_ACTIONS一槍。我曾在一個遺留服務上工作,在我進行重構之前,它曾經經常崩潰。我的前任選擇的補救措施是使用失敗操作來調用(在SYSTEM下運行)的程序,然後重新啓動服務,就好像什麼都沒有發生過一樣。

所有這些只有在您的服務在自己的進程中運行時纔有效,我認爲這是您描述它的方式。如果你的服務是在一個DLL中實現的,那麼不會是的工作。

但我完全同意拉里你應該調查和解決問題,而不是試圖隱瞞它。如上所述,我修復了有問題的服務,並且沒有崩潰或很少崩潰,並且每個人都對該解決方案感到高興;)

+0

我不認爲這有效 - ChangeServiceConfig2會告訴服務控制器重新啓動服務(這是一件很好的事情)。但它依賴於服務控制器知道該服務已經崩潰。 – 2011-03-30 04:48:12

+0

@Larry Osterman:我明白了。 – 0xC0000022L 2011-03-30 18:06:52