java 在window 下调用dos 命令的问题。

原创 2013年12月05日 17:57:22

今天拿到一个需求要求实现通过端口号去杀掉进程,本来想通过进程名去杀进程如(java.exe),但是我们同一个服务器上部署了N个tomcat,意思就是有N个java进程,所以只能通过端口号去识别。

在直接在dos下执行  netstat -ano|findstr 8080,能够找到该进程的pid,然后 通过 taskkill /pid xxx 去杀掉该进程,在dos下运行没问题,可是当通过java 代码去实现的时候遇到了问题。

   

 private static String getPID(int port) throws IOException {
        String pid = "";
        // dos下根据端口查看pid命令;
        String netcmd = "netstat -ano|findstr " + port;
        Runtime runtime = Runtime.getRuntime();
        System.out.println(netcmd);
        Process process2 = runtime.exec(netcmd);
        BufferedReader br2 = new BufferedReader(new InputStreamReader(process2.getInputStream()));
        String line = null;
        while ((line = br2.readLine()) != null) {
            System.out.println(line);
            if ( line.indexOf("LISTEN") != -1 ){
                line = line.replaceAll(" +", " ");
                String[] lineArray = line.split(" ");
                System.out.println(lineArray[5].trim());
                pid = lineArray[5].trim();
            }
        }
        return pid;
    }
当程序运行到 line = br2.readLine() 这行的时候就阻塞了,无法得到运行的返回结果;

可是把打印出来的命令复制到dos窗口下去执行,就没问题。试试了很多次都不行,当我把命令改成 

String netcmd = "netstat -ano "; 执行就没问题,百思不得其解。难道不支持,应该不会。

经过各种折腾,最后把 命令改成  String netcmd = "cmd /c netstat -ano|findstr " + port; 执行成功。

以下是全部代码:

public class StopProgram {
    /**
     * dos下根据端口查看pid命令 缺少参数pid
     */
    private static final String NETSTART_COMMAND = "cmd /c netstat -ano|findstr ";
    /**
     * dos根据pid 杀进程 缺少参数pid
     */
    private static final String TASKKILL_COMMAND = "taskkill /pid ";

    /**
     * 根据端口号获取pid
     * @author 丑丑
     * @creaetime 2013年12月5日 下午3:00:34
     * @param port 端口号
     * @return pid
     * @throws IOException
     */
    private String getPID(int port) {
        String pid = "";
        String cmd = NETSTART_COMMAND + port;
        String line = exeCommand(cmd);
//        System.out.println(line);
        if ( line.indexOf("LISTEN") != -1 ) {
            // 多个空格换成一个
            line = line.replaceAll(" +", " ");
            String[] lineArray = line.split(" ");
            pid = lineArray[5].trim();
        }

        return pid;
    }

    /**
     * 根据pid 杀进程
     * @author 丑丑
     * @creaetime 2013年12月5日 下午3:03:15
     * @param pid 进程号
     * @return true 成功,false 失败
     * @throws IOException
     */
    private boolean killProcess(String pid) throws IOException {
        boolean flag = false;
        String cmd = TASKKILL_COMMAND + pid;
        String line = exeCommand(cmd);
//        System.out.println(line);
        if ( line.contains("成功") ) {
            flag = true;
        }
        return flag;
    }

    /**
     * 执行命令,得到输出内容
     * @author   丑丑
     * @creaetime 2013年12月5日 下午3:25:10
     * @param cmd
     * @return
     */
    private String exeCommand(String cmd) {
        StringBuffer sb = new StringBuffer();
        BufferedReader br = null;
        try {
            Process process = Runtime.getRuntime().exec(cmd);
            br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if ( null != br ) {
                try {
                    br.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }

    /**
     * 停止服务 
     * @author 丑丑
     * @creaetime 2013年12月5日 下午4:55:24
     * @param port
     * @return
     * @throws IOException
     */
    public boolean stopProcess(int port) throws IOException{
        String pid = getPID(port);
        if(null !=pid){
           return killProcess(pid);
        }
        return false;
    }
    
    public static void main(String[] args) {
        
        String pid = new StopProgram().getPID(8888);
        try {
            new StopProgram().killProcess(pid);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

}
搞定。

windows dos 常用命令行(完整)

dir :列出当前目录下的文件以及文件夹 md: 创建目录 rd : 删除目录 cd :进入指定目录 cd.. : 退回到上一级目录 cd\ : 退回到根目录 del:删除文件 exit:退出dos命...
  • ternence_hsu
  • ternence_hsu
  • 2017年04月25日 14:31
  • 474

window dos基本操作命令介绍

C:\Users\Administrator>e: E:\>dir  驱动器 E 中的卷是 新加卷  卷的序列号是 8A98-35BD  E:\ 的目录 2014/09/24  10:40 ...
  • yangguangmeng
  • yangguangmeng
  • 2014年12月03日 17:53
  • 1461

Windows下DOS命令大全(经典收藏)

copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C:  xcopy 要复制的文...
  • a564663276
  • a564663276
  • 2015年03月25日 09:27
  • 5076

dos命令配置jdk环境

1 起因  因为是用的别人电脑,而且没有管理员权限,只给了dos窗口下一个管理员权限,需要配置jdk环境 2 网上搜索的答案,给出的将变量写在注册表里面,以实现永久生效 ::os环境:window...
  • jianfpeng241241
  • jianfpeng241241
  • 2015年09月29日 09:27
  • 860

通过java代码实现dos环境下多条命令的执行

通过java代码一次执行多条dos下的命令,中间需要bat文件
  • wangyi201212
  • wangyi201212
  • 2015年01月19日 09:35
  • 2254

dos下启动Tomcat

Dos启动tomcat 1.首先将tomcat下载后解压到d盘根目录(习惯性放d盘),可以重命名 2.运行里面打开dos命令窗口,切换到tomcat的D:\apache-tomcat-5.5.27\b...
  • xuli99999
  • xuli99999
  • 2013年07月08日 20:56
  • 1634

对C++语言中dos命令的调用及system()函数使用方法的探究

C++ system()函数的使用方法探究
  • Goseqh
  • Goseqh
  • 2017年02月21日 14:49
  • 898

Dos下运行java虚拟内存不足

问题描述 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 解决方案 F:\Workspaces\Perce...
  • u014221266
  • u014221266
  • 2014年03月21日 22:07
  • 794

c语言调用dos命令

if(cmdstring == NULL){               return (1);     }     if((pid = fork())             stat...
  • alone_egao
  • alone_egao
  • 2015年12月02日 16:52
  • 664

关于java命令行在dos窗口下执行class文件时提示“找不到或无法加载类”问题

package com.jintao.javaarray; public class JavaArray { public static void main(String [] args)...
  • sinat_33201468
  • sinat_33201468
  • 2016年05月21日 18:22
  • 3394
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 在window 下调用dos 命令的问题。
举报原因:
原因补充:

(最多只允许输入30个字)