java调用taskkill命令结束windows进程

调用的guava lib:  guava-13.0.1.jar 

import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

import com.google.common.base.Splitter;

public class KillProcess {

    public static List<String> listProcess() {
        List<String> ret = new ArrayList<>();
        
        List<String> command = new ArrayList<>();
        command.add("tasklist");
        
        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            LineNumberReader ir = new LineNumberReader(
                    new InputStreamReader(process.getInputStream(), Charset.forName("gbk"))); //UTF8
            String line;
            while ((line = ir.readLine()) != null) {
                if(!line.isEmpty()) {
                    ret.add(line);
                }
            }
            
            if (process.isAlive()) {
                process.waitFor();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    public static void killProcess(String pid) {
        
        List<String> command = new ArrayList<>(); //taskkill /F /PID
        command.add("taskkill");
        command.add("/F");
        command.add("/PID");
        command.add(pid);
        
        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            LineNumberReader ir = new LineNumberReader(
                    new InputStreamReader(process.getInputStream(), Charset.forName("gbk"))); //UTF8
            String line;
            StringBuffer sb = new StringBuffer();
            while ((line = ir.readLine()) != null) {
                sb.append(line);
            }
            String lines = sb.toString();
            if (lines!=null && lines.contains("Error")) {
                //String msg = String.format("%s\n", lines);
                //throw new Exception("结束进程失败:\n" + msg);
            }
            
            if (process.isAlive()) {
                process.waitFor();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //对存在空格的进程名不好使,如"System Idle Process",但一般没问题
    public static void killProcessWithName(String processName) {
        List<String> processList = listProcess();
        for(String procInfo : processList) {
            Iterator<String> arr = Splitter.on(Pattern.compile("[ ]")).trimResults()
                    .omitEmptyStrings().split(procInfo).iterator();
            
            String procName = arr.next();
            String pid = arr.next();
//            System.out.println("procName: " + procName + " pid: " + pid);
            if(procName.compareToIgnoreCase(processName)==0) {
                killProcess(pid);
            }
        }
    }
    
    public static void killProcessWithName2(String processName) {
        
        List<String> command = new ArrayList<>(); //taskkill /f /im
        command.add("taskkill");
        command.add("/f");
        command.add("/im");
        command.add(processName);
        
        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            LineNumberReader ir = new LineNumberReader(
                    new InputStreamReader(process.getInputStream(), Charset.forName("gbk"))); //UTF8
            String line;
            StringBuffer sb = new StringBuffer();
            while ((line = ir.readLine()) != null) {
                sb.append(line);
            }
            String lines = sb.toString();
            if (lines!=null && lines.contains("Error")) {
                String msg = String.format("%s\n", lines);
                logger.error("结束进程失败:\n" + msg);
            }
            
            if (process.isAlive()) {
                process.waitFor();
            }
        } catch (Exception e) {
            logger.error("结束进程失败 进程名:" + processName, e);
        }
    }
    
    public static void main(String[] args) {
        String procName = "winword.exe"; //匹配进程
        KillProcess.killProcessWithName2(procName);
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值