Java檢測進程列表,進程是否運行,開啓和關閉指定進程

     Boss提了個想法,客戶通過系統頁面可以直接操作服務器的某些進程,包括檢測運行的進程有哪些,指定的進程是否運行,開啓關閉重啓相關的進程,就先寫了個demo功能基本上都實現了,廢話不多說直接貼代碼。

package Test;


import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Demo {
    //得到所有運行的進程名稱
    public static String[] getProcessName() {
        String[] taskName = null;
        List<String> taskList = new ArrayList<String>();
        try {
            Process p = Runtime.getRuntime().exec("tasklist");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "gbk"));
            String s = "";
            while ((s = br.readLine()) != null) {
                if ("".equals(s)) {
                    continue;
                }
                taskList.add(s + "");
            }
            //獲取每列的最長長度
            String maxRow = taskList.get(1) + "";
            String[] maxCol = maxRow.split(" ");
            //進程名稱
            taskName = new String[taskList.size()];
            for (int i = 0; i < taskList.size(); i++) {
                String data = taskList.get(i) + "";
                for (int j = 0; j < maxCol.length; j++) {
                    switch (j) {
                        case 0:
                            taskName[i] = data.substring(0, maxCol[j].length() + 1).trim();
                            data = data.substring(maxCol[j].length() + 1);
                            break;
                    }
                }
            }
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return taskName;
    }

    //查詢進程是否開啓
    public static String getProcessStatus(String[] taskName, String processName) {
        String s = "此進程已結束";
        for (int i = 0; i < taskName.length; i++) {
            System.out.println(taskName[i]);
            if (taskName[i].contains(processName)) {
                s = "此進程已開啓";
            }
        }
        return s;
    }

    //關閉進程
    public static String killProcess(String processName) throws IOException {
        String s = "進程名稱不能爲空";
        String active = getProcessStatus(getProcessName(), processName);
        if (!"".equals(processName)) {
            if (active.equals("此進程已結束")) {
                s = "進程已關閉,無需再次關閉";
            } else {
                Process p = Runtime.getRuntime().exec("taskkill /F /IM " + processName);
                BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "gbk"));
                s = br.readLine().toString();
            }
        }
        return s;
    }

    //開啓進程(相當於重啓) 若存在該進程,再次開啓則存在兩個進程
    public static String startProcess(String processName, String url) throws IOException {
        String s = "進程名稱不能爲空";
        //需要先檢測進程是否存在
        String active = getProcessStatus(getProcessName(), processName);
        if (!"".equals(processName)) {
            if (!"".equals("此進程已開啓")) {
                String kill = killProcess(processName);
                Desktop.getDesktop().open(new File(url));
                s = "進程重啓成功";
            } else {
                Desktop.getDesktop().open(new File(url));
                s = "進程開啓成功";
            }
        }
        return s;
    }
    public static void main(String[] args) throws IOException{
        String[] taskName = getProcessName();
        String s = getProcessStatus(taskName,"chrome.exe");
        System.out.println(s);
        String kill = killProcess("chrome.exe");
        System.out.println(kill);
        String active = startProcess("chrome.exe","C:\\Users\\11654\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe");
        System.out.println(active);
    }
}

   主要用到了process這個類,在流轉換的時候要轉成gbk的,否則中文會亂碼。

  檢測程序只能顯示程序的名稱,以下代碼可以顯示pid號等等。

for (int i = 0; i < tasklist.size(); i++) {
						String data = tasklist.get(i) + "";
						for (int j = 0; j < maxCol.length; j++) {
							switch (j) {
							case 0:
								taskName[i]=data.substring(0, maxCol[j].length()+1);
								data=data.substring(maxCol[j].length()+1);
								break;
							case 1:
								taskPid[i]=data.substring(0, maxCol[j].length()+1);
								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 < taskNec.length; i++) {
						//打印進程列表
						//System.out.println(taskName[i]+" "+taskPid[i]+" "+taskSessionName[i]+" "+taskSession[i]+" "+taskNec[i]);				
						if(taskName[i].contains(processName)){
							count++;//用於進程計數		
						}			
					}
				   }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章