Windows下tomcat shutdown.bat 无法真正停止

摘要:
1.在Windows_ Managent/apache tomcat/bin&&shutdown下执行cmd命令时,Java无法关闭tomcatcmd/kD:&&cdD:/WindowsETC/ETC。解决方案:a:想象一下如何在Windows下结束这个过程。b: 首先,您需要知道程序的端口号。公猫我的默认值是:80cmd/cnetstat-a-no-|findstr:80--˃根据端口号查找pi
1、Windows下 java执行cmd 命令无法关闭tomcat
cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat
 2、解决思路:

 a:想象一下自己在Windows下如何结束进程

 b:  首先你得知道程序的端口号 tomcat 我这默认为:80

    

  cmd /c netstat -a -n -o | findstr :80 --> 根据 端口号找到 pid

  

 Windows下tomcat shutdown.bat 无法真正停止第1张

c:  当你找到pid 后就干掉它:

taskkill /pid 进程号 -t -f

  Windows下tomcat shutdown.bat 无法真正停止第2张

 d:java 应该如和实现 ?

3、思路已有代码时刻:
package updateDepot;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.impl.execchain.MainClientExec;

/**
* @author wzy
* @version 创建时间:2020年1月7日 下午4:18:47
* 类说明
*/
public class testTomcat {
//储存 端口号 private Set<Integer> ports;//在类名下方定义一个变量 public static void main(String[] args) { //cmd /k d: && cd d:/Run/Tomcat/bin && startup.bat // String command = "D:/WindowsETC/ETC_Managent/apache-tomcat/bin/startup.bat";//启动tomcat命令 // String command = "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && startup.bat";//启动tomcat命令 // String command = "rd /s /q D:\WindowsETC\ETC_Managent\apache-tomcat\work\Catalina";//启动tomcat命令 /*Runtime.getRuntime().exec("cmd1 && " +"cmd2 && " +"cmd3 && " );*/ // String command = "java -version"; //String command = "E:\apache-tomcat-7.0.76\bin\tomcat7w.exe";//启动Tomcat命令,仅限windows版本,无弹框 // String command = "taskkill /f /t /im java.exe";//关闭tomcat命令 // String command = "D:\WindowsETC\ETC_Managent\apache-tomcat\bin\shutdown.bat";//关闭tomcat命令 // String command = "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat";//关闭tomcat命令 // String command = "cmd /c D: && cd D:\WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat";//关闭tomcat命令 String command = "cmd /c netstat -a -n -o | findstr :80";//关闭tomcat命令 // testTomcat callTomcat = new testTomcat(); // // try { // // callTomcat.callCommand(command); // // } catch (IOException e) { // // System.out.println("执行命令时出错:" + e.getMessage()); // // } testTomcat callTomcat = new testTomcat(); String port[]={"80"}; killPort(port); // callTomcat.killPort(port); }


// cmd 执行命令 public void callCommand(String command) throws IOException { Runtime runtime = Runtime.getRuntime();//返回与当前的Java应用相关的运行时对象 //指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例 Process process = runtime.exec(command); runtime.gc();//运行垃圾回收器 String line = null; String content = ""; BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); while((line = br.readLine()) != null) { content += line + " "; System.out.println(line); } // System.out.println(content); } //根据 端口号进行查找 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<String> 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(); } } //读取 java执行cmd 命令返回的 结果 只是 干掉 pid使用 private List<String> read(InputStream in,String charset) throws IOException{ List<String> 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; } } //具体执行 干掉进程方法 public void kill(List<String> data) { Set<Integer> 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); System.out.println(pid); // taskkill /pid 2044 -t -f //结束xxxx进程 pid 为 查询出的 pid callCommand("taskkill /pid "+pid+" -t -f"); } catch (NumberFormatException e) { System.out.println("获取的进程号错误:" + spid); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } pids.add(pid); } }
//方法入口 public static void killPort(String[] _ports) { Set<Integer> 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(); } } } //machNetSetDaoImp 表示当前的类名 testTomcat kill = new testTomcat(); 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"); } }
  结果:

Windows下tomcat shutdown.bat 无法真正停止第3张

为啥搞这个。。。。。。。辛酸泪啊。。。。

我们公司 用servlet 写的后台+jsp 页面 + tomcat  分为 Windows /redhat /Ubuntu  其中{Windows 分为 win7 win10  Windows server  真恶心}

涉及到 后续的 版本更新维护 搞得升级程序用的一个jar包  思路很明显。 

1、对比版本号

2、替换war包

3、是否替换成功,成功好,启动

ok看似非常简单没啥难度的。。。。。

好的先写 linux的 非常轻松。

当写Windows 好您要的坑已经 准备完毕 真酸爽!

当你启动 startup.bat  {cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && startup.bat}  时非常舒服 没啥

但是shutdown.bat 时问题来了 各种报错。说你xxx 没有释放xxx 没有关闭。

试验了很久 各方百度 "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat“ ------> 这个破命令 坑死我了 (曾有人说过 实践才是检验真理的唯一标准,有些 帖子试都没试 直接从别人哪里 粘贴复制 根本没用,更别说检验了。还有写了一堆错误方法真 tmxxx  害人害己,粘贴需谨慎)。

当你关闭---->Windows下tomcat shutdown.bat 无法真正停止第4张 没有报错提示 依旧没有任何一丁点一丢丢 作用  并不能 100% 成功 关闭

好既然你这个样子 那就别怪我心狠手辣了 ,从根源切断不留任何后路 。然后此文章就出现了

 此贴中有 参考 :

https://blog.csdn.net/zxf1242652895/article/details/84313963

感谢大神

此代码中为我自己后加注释 开箱即用版 舒服 cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat“------->实践才是检验真理的唯一标准

免责声明:文章转载自《Windows下tomcat shutdown.bat 无法真正停止》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt: error: C2001: 常量中有换行符定时任务应该这么玩下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

虚拟服务器跟端口映射

一、端口映射作用  路由器中设置端口映射的主要作用,是让Internet上的其他用户,可以访问你路由器下面电脑中的数据(软件、文件)。 路由器中设置好端口映射后,可以让Internet上的其他用户,先访问你路由器WAN接口的IP地址,路由器会自动把访问请求,转发到事先设置好的电脑上面。 二、确定映射端口号 在设置之前,先弄清楚你需要映射的端口号到底是多...

Apache Tomcat 7 安装与配置

下载 首先需要下载tomcat7的安装文件,地址如下: http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.69/bin/apache-tomcat-7.0.69.tar.gz 安装与配置 安装之前需要确保已经安装JDK,若没有安装JDK请参考上一篇blog先正确安装JDK: Linux CentOS...

windows系统中如何启动两个tomcat

阅读指南:如何同时启动多个tomcat? 步骤:启动另一个tomcat中需要修改server.xml配置文件的三个端口号; 1.修改<Server port="18005" shutdown="SHUTDOWN">,这个是服务器的端口号,我在此处修改为18005; 2.修改<Connector connectionTimeout="200...

【转】Kettle集群

本文转自:http://blog.csdn.net/dqswuyundong/article/details/5952009 Kettle集群 Kettle是一款开源的ETL工具,以其高效和可扩展性而闻名于业内。其高效的一个重要原因就是其多线程和集群功能。 Kettle的多线程采用的是一种流水线并发的机制,我们在另外的文章中专门有介绍。这里主要介绍的是ke...

iis下项目绑定ip、域名以及443端口号之后项目启动不起来,iis提示“另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020) ”

iis下项目绑定ip、域名以及443端口号之后项目启动不起来,iis提示“另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020) ”  很明显,80或是443端口已被另一个程序占用,所以发生此错误。解决此问题得找到哪个程序占用掉80或是443端口     注:对于443端口,SVN很多时候回占用 这个端口 、 打开CMD...

fiddler实现手机抓包及手机安装证书报错“无法安装该证书 因为无法读取该证书文件”解决方法

 Fiddler是一个轻量级的http抓包工具,且有良好的用户界面,实用强大易上手。通过设置代理接受处理所有的http请求和响应,可以很轻松的对手机上的安卓应用进行抓包。 电脑最好是笔记本,这样能和手机保持统一局域网内;其他不多说,直接说步骤了。 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddler默认只抓取...