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++;//用于进程计数
}
}
}