在Windows上如何通过端口号查找进程ID并使用Java关闭找到的任务

3

我需要在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");

但是我不知道如何将netstat输出的PID传递给“taskkill”命令,有人可以给我建议吗?

你可以使用 -b 开关获取拥有每个端口的进程或文件(无法确切回忆)。这是更进一步的一步。 - watery
1个回答

2
您可以执行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);
    }

"

-a" 参数会导致 Process Builder 无限期等待,需要将其删除。如果您需要获取错误流,则可以添加以下内容。

"
printProcessStream(process.getErrorStream());

一旦您获得响应流,您可以解析数据并识别待杀死的PID。随后,您可以使用类似的逻辑但更改命令,而不是使用netstat命令,使用"kill -9 $PID" 命令最终杀死该进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接