• java 利用tasklist命令,根据进程名称找到PID,并杀死进程


    完整代码

    package other;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class KillProcessTest {
    
        public static void main(String[] args) throws Exception {
            /*
             * 下面先是获取进程列表
             */
            Runtime runtime = Runtime.getRuntime();
            List tasklist = new ArrayList();
            try {
                Process process = runtime.exec("tasklist");
    //            获取控制台输出
                BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(),"utf-8"));
                String s = "";
                while ((s = br.readLine()) != null) {
    // 去掉第一行的空行
    if ("".equals(s)) { continue; } tasklist.add(s+" "); } // 获取每列最长的长度 String maxRow = tasklist.get(1) + ""; //根据空格截取tasklist中双横线,并且每个maxCol[],都表明了每一个进程的镜像名称、pid、会话名、会话#、内存使用的字符串最长长度 String[] maxCol = maxRow.split(" "); // 定义映像名称数组 String[] taskName = new String[tasklist.size()]; // 定义 PID数组 String[] taskPid = new String[tasklist.size()]; // 会话名数组 String[] taskSessionName = new String[tasklist.size()]; // 会话#数组 String[] taskSession = new String[tasklist.size()]; // 内存使用 数组 String[] taskNec = new String[tasklist.size()]; // 循环tasklist for (int i = 0; i < tasklist.size(); i++) { //取出每一行的tasklist值,比如:System 4 Services 0 2,652 K String data = tasklist.get(i) + ""; // 循环每一列,从 0-5 for (int j = 0; j < maxCol.length; j++) { switch (j) { case 0: //这里存取的值包含空格 taskName[i]=data.substring(0, maxCol[j].length()+1); //截取data,便于下一case取值 data=data.substring(maxCol[j].length()+1); // System.out.println("data="+data); break; case 1: taskPid[i]=data.substring(0, maxCol[j].length()+1); System.out.println("taskPid="+taskPid[i]+" \t"+taskPid[i].length()); data=data.substring(maxCol[j].length()+1); break; case 2: taskSessionName[i]=data.substring(0, maxCol[j].length()+1); data=data.substring(maxCol[j].length()+1); break; case 3: taskSession[i]=data.substring(0, maxCol[j].length()+1); data=data.substring(maxCol[j].length()+1); break; case 4: taskNec[i]=data; break; } } } for (int i = 0; i < taskName.length; i++) { //打印进程列表 //System.out.println(taskName[i]+" "+taskPid[i]+" "+taskSessionName[i]+" "+taskSession[i]+" "+taskNec[i]); //根据进程名称找到PID,杀掉notepad.exe if(taskName[i].contains("notepad.exe")) { //杀死进程 Runtime.getRuntime().exec("taskkill /F /PID "+taskPid[i]); System.out.println(taskPid[i]); } } } catch (Exception e) { e.printStackTrace(); } } }

    解析:

    1、

      // 获取每列最长的长度
     String maxRow = tasklist.get(1) + "";

    指的是获取双横线的最长长度,每一个进程的每一个打印不会超过双横线

    2、

    //根据空格截取tasklist中双横线,并且每个maxCol[],都表明了每一个进程的镜像名称、pid、会话名、会话#、内存使用的字符串最长长度
    String[] maxCol = maxRow.split(" ");

    每一个字符串数组里面存储的是每一个双横线,总共是5个

    3、定义5个字符串数组,用于存储 镜像名称、pid、会话名、会话#、内存使用

                // 定义映像名称数组
                String[] taskName = new String[tasklist.size()];
                // 定义 PID数组
                String[] taskPid = new String[tasklist.size()];
                // 会话名数组
                String[] taskSessionName = new String[tasklist.size()];
                // 会话#数组
                String[] taskSession = new String[tasklist.size()];
                // 内存使用 数组
                String[] taskNec = new String[tasklist.size()];

    4、

    从每一行中读到data后,进行截取,截取的长度是maxCol[j].length()+1; “maxCol[j].length()+1;”是指计算的双横线的长度,也就是镜像名称最大的长度,同样地case 1-4中maxCol[j].length()+1 取的是pid、会话名、会话#、内存使用的字符串最大长度;这样data.substring(0,maxCol[j].length()+1);就能截取到每一个值;

    data=data.substring(maxCol[j].length()+1);是指每一列数据,减去已经取到的镜像名称,这样剩余case利用data.substring(0,maxCol[j].length()+1);就能取到值
    例如:data=   13272 Services                   0     30,672 K 
    data=   Services                   0     30,672 K 
    data=          0     30,672 K 
    data=       30,672 K 
     
     case 0:
                //这里存取的值包含空格                     
                 taskName[i]=data.substring(0,maxCol[j].length()+1);
                //截取data,便于下一case取值
                  data=data.substring(maxCol[j].length()+1);
                  break;

    图片

  • 相关阅读:
    linux yum命令实践(二)
    linux的yum命令实践
    svn代码回滚命令
    Java连接mysql示例代码
    精品验证码
    稳定性测试,需要对EPC或DIC任务进行翻倍操作,供后续使用
    读取csv
    设置启动参数:禁用密码保存
    gridview超链接列链接方法 (转贴)
    gridview 跨行 跨列(原创)
  • 原文地址:https://www.cnblogs.com/ychun/p/16532920.html
Copyright © 2020-2023  润新知