在java中,有没有办法检查Windows服务的状态?

问题描述:

我正在寻找一个库,可以查看Windows服务的状态以验证服务是否已启动并正在运行。我查看了Sigar库,但它是GPL,因此我无法使用它。商业或BSD(ISH)许可证是必需的,因为这将被捆绑到商业软件中。在java中,有没有办法检查Windows服务的状态?

如果没有别的帮助,尽量想稍微不同的方式(如果可以的话,当然),例如:

  • 有足够的空闲/非自由软件,它确实监测,包括Windows服务监控(例如,Nagios,Zabbix等)。这些监视器通常具有开放的API,您的Java应用程序可以以多种不同的方式集成到这些API中。
  • 如果您可以控制依赖服务应用程序,请为您的Java应用程序公开另一种不同的方式来检查(例如,在端口上运行伪侦听器,创建文件等)。 Windows服务不是一个跨平台的东西,因此您不希望在短时间内得到支持。

我不知道任何库,但取决于你需要得到多少详细信息才能使用某些shell命令并解析输出。

NET START 服务名

要么启动该服务,或给你回,告诉你它已经启动的错误消息。我不知道任何能够给你身份的命令。

我不认为有任何纯粹的Java方式来做到这一点,因为一些操作系统没有Windows那样的“服务”概念。在我们的项目中,我们编写了一个从命令行调用“sc”命令的包装器。为了得到一个服务的状态,你可以这样做:

SC \\一些计算机查询“我的服务名”

你必须手动解析输出,但它是非常简单的。

+0

在Java中这样做的简单方法 – 2010-03-25 17:50:02

我认为这是检查服务状态的最好方法。

import java.util.*; 
    import java.sql.*; 
    import java.io.*; 
    import java.text.*; 
    public class doscmd 
    { 
     public static void main(String args[]) 
      { 
      try 
      { 
       Process p=Runtime.getRuntime().exec("sc query browser"); //sc query is commond and browser is the name of service 

    BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 

       String line=reader.readLine(); 
       while(line!=null) 
       { 
        if(line.trim().startsWith("STATE")) 

        { 

        if (line.trim().substring(line.trim().indexOf(":")+1,line.trim().indexOf(":")+4).trim().equals("1")) 
     System.out.println("Stopped"); 
    else 
     if (line.trim().substring(line.trim().indexOf(":")+1,line.trim().indexOf(":")+4).trim().equals("2")) 
      System.out.println("Startting...."); 
     else 
      if (line.trim().substring(line.trim().indexOf(":")+1,line.trim().indexOf(":")+4).trim().equals("3")) 
       System.out.println("Stopping...."); 
      else 
       if (line.trim().substring(line.trim().indexOf(":")+1,line.trim().indexOf(":")+4).trim().equals("4")) 
        System.out.println("Running"); 

     } 
     line=reader.readLine(); 
     } 

    } 

    catch(IOException e1) { } 



     } 
    }