查找并杀死进程
tasklist介绍
taskkill介绍
在windows系统环境下 ,通过进程名称查看该进程是否存在,存在的话 taskkill结束进程。
public class ProcessUtil {
private static final Log logger = LogFactory.getLog(ProcessUtil.class);
//传入进程名称processName
public static boolean findAddKillProcess(String processName) {
BufferedReader bufferedReader = null;
try {
Process proc = Runtime.getRuntime().exec("c:\\windows\\system32\\tasklist -fi " + '"' + "imagename eq " + processName +'"');
bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
logger.info("findProcess()获取到的进程信息:" + line);
if (line.contains(processName)) {
killProcess(processName);
logger.info("找到并且杀死进程:" + processName);
return true;
}
}
return false;
} catch (Exception ex) {
ex.printStackTrace();
return false;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (Exception ex) {}
}
}
}
//通过进程名称杀死进程
public static void killProcess(String processName) {
try {
if(processName != null) {
Process pro = Runtime.getRuntime().exec("c:\\windows\\system32\\taskkill /F /im "+ processName);
BufferedReader brStd = new BufferedReader(new InputStreamReader(pro.getInputStream()));
BufferedReader brErr = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
long time = System.currentTimeMillis();
while (true) {
if (brStd.ready()) {
logger.info("killProcess()进程正常返回:" + processName);
break;
}
if (brErr.ready()) {
logger.info("killProcess()进程出错返回:" + processName);
break;
}
if(System.currentTimeMillis() - time > 3000) {
logger.info("killProcess()等待超时:" + processName);
return;
}
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
为什么要用while(true) 等待返回才跳出?
在调用Process pro = Runtime.getRuntime().exec("c:\\windows\\system32\\taskkill /F /im "+ processName);
之后,若没有等待pro返回,这个时候java代码继续向下执行,如果后面的代码有创建名称为processName的进程,
进程创建有可能比调用windows的taskkill先执行,这个时候新启动的进程也会一并被kill掉。
Tasklist命令用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数。使用格式为:Tasklist [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]。其中:
/S system 指定连接到的远程系统。
/U [domain\]user 指定使用哪个用户执行这个命令。
/P [password] 为指定的用户指定密码。
/M [module] 列出调用指定的DLL模块的所有进程。如果没有指定模块名,显示每个进程加载的所有模块。
/SVC 显示每个进程中的服务。
/V 显示详细信息。
/FI filter 显示一系列符合筛选器指定的进程。
/FO format 指定输出格式,有效值:TABLE、LIST、CSV。
/NH 指定输出中不显示栏目标题。只对TABLE和CSV格式有效。
例如查找eclipse.exe进程 : tasklist -fi "imagename eq eclipse.exe"
详见:tasklist /?
taskkill是用来终止进程的。具体的命令规则如下: TASKKILL [/S system [/U username [/P [password]]]] { [/FIfilter] [/PIDprocessid | /IM imagename] } [/F] [/T] 描述: 这个命令行工具可用来结束至少一个进程。 可以根据进程 id 或图像名来结束进程。 参数列表:
/S system 指定要连接到的远程系统。
/U [domain\]user 指定应该在哪个用户上下文 执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示输入。
/F 指定要强行终止的进程。 /FI filter 指定筛选进或筛选出查询的的任务。
/PID process id 指定要终止的进程的PID。
/IM image name 指定要终止的进程的图像名。通配符 '*'可用来指定所有图像名。
/T Tree kill: 终止指定的进程和任何由此启动的子进程。
/? 显示帮助/用法。 筛选器: 筛选器名 有效运算符 有效值