处理windows 下shutdown.bat 杀不死tomcat 进程

windows操作系统下  之前通过shutdown.bat  最后发现根本杀不死tomcat相关的进程

	try {
			boolean check=true;
			Properties props=System.getProperties(); //获得系统属性集    
			String osName = props.getProperty("os.name"); //操作系统名称    
			if(osName!=null&&osName.contains("Window")){
				check=true;
			}else{
				check=false;
			}
			if(check){//windows
			    String location = System.getenv("CATALINA_HOME");
 		         executeCmd(location); 
				
			}else{//linux
				String commands="killall java";
				Runtime runtime = Runtime.getRuntime();
				Process pro = runtime.exec(commands);
				pro.waitFor();
				commands="/**/**/apache-tomcat-7.0.65/bin/startup.sh";
				pro = runtime.exec(commands);
				pro.waitFor();
			 
			}
		} catch(Exception e){
			return "fail";
		}
		return "success";
private static void executeCmd(String location) {  
	        System.out.println(location);  
	        Runtime run = Runtime.getRuntime();  
	        try {  
	            Process ps = run.exec("" + location + "\\bin\\shutdown.bat");  
	             
 	            BufferedReader br = new BufferedReader(new InputStreamReader( ps.getInputStream(), "utf-8"));// 注意中文编码问题  
 	            String line;  
	            while ((line = br.readLine()) != null) {  
	                System.out.println("StartedLog==>" + line);  
	            }
   	            br.close();  
   	            
 	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
 	     
	    }  

最后发现杀不死tomcat进程  

 

改进后:我直接通过tomcat 的端口号 根据端口号去查找所有与之相关的进程 然后在杀死

private Set ports;//在类名下方定义一个变量
		try {
			//关闭quartz任务;
			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  			scheduler.shutdown();
   			Thread.sleep(2000);
			boolean check=true;
			Properties props=System.getProperties(); //获得系统属性集    
			String osName = props.getProperty("os.name"); //操作系统名称    
			if(osName!=null&&osName.contains("Window")){
				check=true;
			}else{
				check=false;
			}
			if(check){
                //这里是Tomcat端口好 我这边是写死了,这也可以通过代码获取
 			    String port[]={"10012"};
			    killPort(port);
  			}else{
				String commands="killall java";
				Runtime runtime = Runtime.getRuntime();
				Process pro = runtime.exec(commands);
				pro.waitFor();
				commands="/**/**/apache-tomcat-7.0.65/bin/startup.sh";
				pro = runtime.exec(commands);
				pro.waitFor();
				 
			}
		} catch(Exception e){
			return "fail";
		}
		return "success";
public static void killPort(String[] _ports) {
	        Set ports = new HashSet<>();
	        for (String spid : _ports) {
	            try {
	                int pid = Integer.parseInt(spid);
	                ports.add(pid);
	            } catch (Exception e) {
	                System.out.println("错误的端口号,请输入一个或者多个端口,以英文逗号隔开");
	                try {
	                    Thread.sleep(3000);
	                } catch (InterruptedException e1) {
	                    e1.printStackTrace();
	                }
	                System.exit(0);
	            }
	        }
           //machNetSetDaoImp 表示当前的类名
	        machNetSetDaoImp kill = new machNetSetDaoImp();
	        kill.ports = ports;
	        System.out.println("need kill " + ports.size() + " num");
	        for (Integer pid : ports) {
	            kill.start(pid);
	        }
	        System.out.println("清理完毕,程序即将退出");
 	        System.out.println("SUCCESS");
 	        System.exit(0);
 	    }
	 
	    public void kill(List data) {
	        Set pids = new HashSet<>();
	        for (String line : data) {
	            int offset = line.lastIndexOf(" ");
	            String spid = line.substring(offset);
	            spid = spid.replaceAll(" ", "");
	            int pid = 0;
	            try {
	                pid = Integer.parseInt(spid);
	            } catch (NumberFormatException e) {
	                System.out.println("获取的进程号错误:" + spid);
	            }
	            pids.add(pid);
	        }
 	    }
 
	   public void start(int port){
 	        Runtime runtime = Runtime.getRuntime();
	        try {
	            //查找进程号
	            Process p = runtime.exec("cmd /c netstat -ano | findstr \""+port+"\"");
	            InputStream inputStream = p.getInputStream();
	            List read = read(inputStream, "UTF-8");
	            if(read.size() == 0){
	                System.out.println("找不到该端口的进程");
	                try {
	                    Thread.sleep(6000);
	                    System.exit(0);
	                } catch (InterruptedException e) {
	                    e.printStackTrace();
	                }
	            }else{
	                for (String string : read) {
	                    System.out.println(string);
	                }
	                System.out.println("找到"+read.size()+"个进程,正在准备清理");
	                kill(read);
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        } 
	    }
	   private List read(InputStream in,String charset) throws IOException{
	        List data = new ArrayList<>();
	        BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
	        String line;
	        while((line = reader.readLine()) != null){
	            boolean validPort = validPort(line);
	            if(validPort){
	                data.add(line);
	            }
	        }
	        reader.close();
	        return data;
	    }
	   private boolean validPort(String str){
	        Pattern pattern = Pattern.compile("^ *[a-zA-Z]+ +\\S+");
	        Matcher matcher = pattern.matcher(str);
 	        matcher.find();
	        String find = matcher.group();
	        int spstart = find.lastIndexOf(":");
	        find = find.substring(spstart + 1);
	        
	        int port = 0;
	        try {
	            port = Integer.parseInt(find);
	        } catch (NumberFormatException e) {
	            System.out.println("查找到错误的端口:" + find);
	            return false;
	        }
	        if(this.ports.contains(port)){
	            return true;
	        }else{
	            return false;
	        }
	    }

 

你可能感兴趣的:(java,方法积累,java,tomcat,进程,shutdown.bat,秋风伴落叶)