windows下通过进程名称查找进程并杀死进程

查找并杀死进程

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命令用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数。使用格式为: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是用来终止进程的。具体的命令规则如下:  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: 终止指定的进程和任何由此启动的子进程。  

/? 显示帮助/用法。  筛选器:  筛选器名 有效运算符 有效值

你可能感兴趣的:(java)