2012-01-31 511 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