2012-01-31 182 views
19

我们如何从Java启动/停止Windows服务?例如,我想从Java启动和停止mysql Windows服务。从java启动windows服务

如果可以启动/停止,那么是否有可能知道服务是否成功启动?

+1

在Windows中,您可以使用DOS命令解释器中的sc.exe命令来启动/停止/查询服务名称;例如:'sc \\ 10.8.0.1 query spserv'查询IP地址为10.8.0.1的PC上名为“spserv”的服务的当前状态。您可以在本地或远程执行此操作。 – 2012-01-31 06:02:58

+0

您也可以使用“net start/stop ”来启动服务。 – Manish 2012-01-31 06:04:02

+0

有关服务控制器(sc.exe)检查[服务控制器](http://ss64.com/nt/sc.html)的更多信息。并检查以下增强的答案。 – pavan 2012-02-07 05:26:44

回答

22
String[] script = {"cmd.exe", "/c", "sc", "query", APP_SERVICE_NAME, "|", "find", "/C", "\"RUNNING\""};//to check whether service is running or not 

String[] script = {"cmd.exe", "/c", "sc", "start", SERVICE_NAME};//to start service 

String[] script = {"cmd.exe", "/c", "sc", "stop", SERVICE_NAME};//to stop service 

使用的Runtime.exec(字串[] args)

+1

如果我尝试启动/停止没有管理员权限的服务,它会提供拒绝访问。 任何想法如何执行这与管理访问在JAVA? – 2017-08-15 15:23:38

+0

我知道的一种方式是管理员将权限授予用户,尝试更改服务。我不是Windows用户,因此无法详细解释。 – pavan 2017-09-25 06:16:34

2

可以执行系统使用exec()命令从Java命令 - 在同一个简单的教程可以在这里找到 - http://www.java-samples.com/showtutorial.php?tutorialid=8

现在你可以使用系统命令来启动/停止Windows服务 - 样本同样可以在这里

http://www.windowsitpro.com/article/registry2/how-can-i-stop-and-start-services-from-the-command-line-

发现我不是很肯定监控状态,所以不能有很大帮助在这方面

+0

'sc.exe'更精细那个'net.exe'并且可以帮助你获得更多关于Windows服务的细节。参见'sc /?'它可以做什么。但是,Windows的默认实用程序仍然需要管理员权限。 – ecle 2012-01-31 14:37:39

+0

你如何处理海拔需求? – 2017-02-06 16:43:22

0

你尝试JNA执行脚本?它有一些很好的API来做到这一点。

JNA在SO中非常活跃 - 您可以回来here提出具体问题。

3
import java.io.*; 
import java.util.*; 

public class ServiceStartStop { 
    public static void main(String args[]) { 
     String[] command = {"cmd.exe", "/c", "net", "start", "Mobility Client"}; 
     try { 
      Process process = new ProcessBuilder(command).start(); 
      InputStream inputStream = process.getInputStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch(Exception ex) { 
      System.out.println("Exception : "+ex); 
     } 
    } 
} 

它工作得很好....而不是“sc”使用“net”命令。

+0

请注意,由于Java 1.7,你可以调用'inheritIO' https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#inheritIO()重定向到标准输出从运行一个过程。 – 2016-06-14 07:22:16