我在C#(運行於XP嵌入式)上運行的應用程序正在與作爲Windows服務實現的「看門狗」通信。設備啓動時,此服務通常需要一段時間才能啓動。我想從我的代碼中檢查服務是否正在運行。我怎樣才能做到這一點?如何驗證Windows服務是否正在運行
150
A
回答
290
我想這樣的事情會的工作:
添加System.ServiceProcess到您的項目引用(這是.NET選項卡上)。
的快捷方式:
return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running;
的更安全的方式:
try
{
using(ServiceController sc = new ServiceController(SERVICE_NAME))
{
return sc.Status == ServiceControllerStatus.Running;
}
}
catch(ArgumentException) { return false; }
catch(Win32Exception) { return false; }
的詳細方法:
using System.ServiceProcess;
//
ServiceController sc;
try
{
sc = new ServiceController(SERVICE_NAME);
}
catch(ArgumentException)
{
return "Invalid service name."; // Note that just because a name is valid does not mean the service exists.
}
using(sc)
{
ServiceControllerStatus status;
try
{
sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically.
status = sc.Status;
}
catch(Win32Exception ex)
{
// A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status.
// See Win32 QueryServiceStatus()'s documentation.
return "Error: " + ex.Message;
}
switch(status)
{
case ServiceControllerStatus.Running:
return "Running";
case ServiceControllerStatus.Stopped:
return "Stopped";
case ServiceControllerStatus.Paused:
return "Paused";
case ServiceControllerStatus.StopPending:
return "Stopping";
case ServiceControllerStatus.StartPending:
return "Starting";
default:
return "Status Changing";
}
}
編輯:另外還有一點需要一個期望的狀態的方法sc.WaitforStatus()
和超時,從未使用它,但它可能適合您的需求。
編輯:一旦你獲得狀態,再次獲得狀態,你需要先撥打sc.Refresh()
。
參考:ServiceController .NET中的對象。
18
請看看.NET中的ServiceController對象。
9
在這裏,您可以在本地機器中獲得所有可用服務及其狀態。
ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
Console.WriteLine(service.ServiceName+"=="+ service.Status);
}
您可以比較內環service.name物業服務,你會得到你的服務的狀態。 詳情請去http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx 也http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx
相關問題
- 1. 如何驗證nginx是否在運行?
- 2. 如何驗證Windows服務是否停止或正在運行,並等待它處於此狀態?
- 3. 驗證Cloudera Hadoop服務是否在容器中運行
- 4. 檢查服務是否正在運行?
- 5. 如何通過Windows命令行確定ALBD服務是否正在運行?
- 6. 檢查一個Windows服務是否正在運行?
- 7. 如何從命令行測試服務是否正在運行
- 8. 如何找出Web服務是否正在運行?
- 9. C程序 - 如何檢查Web服務是否正在運行
- 10. 如何知道emacs服務器是否正在運行
- 11. 如何檢查Redis服務器是否正在運行
- 12. 如何檢查硒服務器是否正在運行?
- 13. 如何知道hbase服務器是否正在運行
- 14. 檢查SQL服務器服務是否正在運行
- 15. 是否可以驗證Windows服務是否從另一臺計算機上運行?
- 16. 如何驗證Windows服務是否已安裝並使用批處理文件運行
- 17. 當在Windows Server 2003上運行CruiseControl.NET 1.4.4 SP1服務時,SVN + SSH身份驗證正在運行
- 18. 驗證網址是否有效並正在運行
- 19. PHP - 驗證程序是否正在運行
- 20. 如何檢索Windows服務正在運行的用戶名?
- 21. WCF服務託管在Windows服務將無法正常運行
- 22. TensorFlow:如何驗證它是否在GPU上運行
- 23. Windows服務無法正常運行c#
- 24. 是否可以運行在Windows服務中託管的Orleans
- 25. 運行windows服務觀看服務正在運行增長內存(泄漏)
- 26. 如何驗證一行是否已在SQL服務器中刪除
- 27. 如何檢測Windows機器是否正在運行IPV4或IPV6?
- 28. 無法從服務器驗證用戶輸入是否正確?
- 29. 如何使Windows服務保持運行
- 30. 如何從Windows服務運行msbuild?
Oooh ...甚至比通過WMI滾動自己的更好。我會刪除我的答案。 – EBGreen 2008-10-07 12:12:50
@EBGreen - 我不知道,WMI路線可能對未來的其他人有用,有不止一種方式來剝皮貓,以及所有這些.... – Carl 2008-10-07 12:16:06