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++;//用於進程計數
}
}
}