2015-08-27 26 views
1

我需要通過進程端口在java代碼中終止進程。 我可以做手工像CMD:如何在Windows中通過端口找到PID並使用java終止找到的任務

C:\>netstat -a -n -o | findstr :6543 
TCP 0.0.0.0:6543   0.0.0.0:0    LISTENING  1145 
TCP [::]:6543    [::]:0     LISTENING  1145 

C:\>taskkill /F /PID 1145 

在java中我可以像執行cmd命令:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "netstat -a -n -o | findstr :6543"); 

但我不知道怎麼弄的PID netstat的輸出,並將其轉移到「taskkill」命令。有人可以建議我嗎?

+0

您可以通過'-b'開關獲取每個端口所擁有的進程或文件(無法精確調出)。這是更進一步的。 – watery

回答

1

您可以執行ProcessBuilder並從輸入流獲取響應。

示例代碼:

public static void main(String[] args) throws IOException, InterruptedException 
    { 
    ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", "netstat -n -o | findstr :6129"); 
    Process process = builder.start(); 
    process.waitFor(); 
    printProcessStream(process.getInputStream()); 
    } 

    private static void printProcessStream(InputStream inputStream) throws IOException 
    { 
    int bytesRead = -1; 
    byte[] bytes = new byte[1024]; 
    String output = ""; 
    while((bytesRead = inputStream.read(bytes)) > -1){ 
     output = output + new String(bytes, 0, bytesRead); 
    } 
    System.out.println(" The netstat command response is \r\n"+output); 
    } 

netstat的的 「-a」 參數會導致進程生成器無限期地等待。你需要刪除它。另外,如果您需要獲取錯誤流,則可以添加以下內容。

printProcessStream(process.getErrorStream()); 

一旦獲得響應流,就可以解析數據並識別要殺死的PID。隨後你可以使用類似的邏輯,但改變命令,而不是netstat,你可以使用命令「kill -9 $ PID」來終止進程。

相關問題